LeetCode-1336. El número de transacciones por visita (difícil)

Tabla: Visitas

+ --------- + --------------- +
| columna Nombre | Tipo |
+ --------------- + + ---------
| user_id | int |
| VISIT_DATE | FECHA |
+ --------------- + --------- +
(user_id, VISIT_DATE) es la clave primaria de la tabla
para cada fila de la tabla representa el acceso VISIT_DATE banco user_id
 

表: Transacciones

+ --------- + ------------------ +
| columna Nombre | Tipo |
+ ------------- + --------- + -----
| user_id | int |
| sobre TRANSACTION_DATE | FECHA |
| CANTIDAD | int |
+ ------------------ + --------- +
la tabla no tiene una clave principal, lo que puede haber filas duplicadas
para cada fila de la tabla representa el TRANSACTION_DATE user_id completó una cantidad importe de la transacción
puede garantizar que los usuarios (usuario) en TRANSACTION_DATE visitó Bank ( Esa tabla contiene Visitas (user_id, TRANSACTION_DATE) línea)
 

Los bancos quieren obtener el número de transacciones en el cliente de un banco en una sola visita y el número correspondiente de clientes en la primera visita de las listas de transacciones

¿Cuántos clientes escribir un acceso de consulta SQL para el banco, pero no llevó a cabo ninguna transacción, el número de clientes visitaron un transacciones bancarias, etc.

Los resultados incluyen dos:

transactions_count: visitar las transacciones de los clientes
visits_count: una vez cuando el número de clientes para acceder a las transacciones correspondientes en transactions_count
valor transactions_count de 0 usuarios a visitar todos los max (transactions_count) 

Ordenar por transactions_count

Los siguientes son ejemplos de formato de resultados de consulta:

表visitas:
+ --------- + ------------ +
| user_id | visit_date |
+ --------- + ------------ +
| 1 | 01/01/2020 |
| 2 | 01/02/2020 |
| 12 | 01/01/2020 |
| 19 | 01/03/2020 |
| 1 | 01/02/2020 |
| 2 | 01/03/2020 |
| 1 | 01/04/2020 |
| 7 | 01/11/2020 |
| 9 | 01/25/2020 |
| 8 | 01/28/2020 |
+ --------- + ------------ +
Transacciones表:
+ --------- + ------------ ------ + -------- +
| user_id | TRANSACTION_DATE | cantidad |
+ --------- + ------------------ + -------- +
| 1 | 01/02/2020 | 120 |
| 2 | 01/03/2020 | 22 |
|. 7 | 01/11/2020 | 232 |
. | 1 | 01/04/2020 |. 7 |
. | 9 | 01/25/2020 | 33 es |
. | 9 | 01/25/2020 | 66 |
. | 8 | 2020-01 -28 | 1 |
| 9 | 01/25/2020 | 99 |
+ --------- + ------------------ + ---- ---- +
tabla de resultados:
+ -------------------- + -------------- +
| transactions_count | visits_count |
-------------------- -------------- + + +
| 0 |. 4 |
. | 1 |. 5 |
| 2 | 0 |
| 3 | 1 |
+ -------------------- + -------------- +
* Para transactions_count = 0, visitas el (1, "2020-01-01"), (2, '01/02/2020'), (12, '01/01/2020') y (19 "2020- 01-03 ") no se negocia, por lo visits_count = 4.
* Para transactions_count = 1, visitas (para 2, "01/03/2020"), (7 '01.11.2020'), (8, "01/28/2020"), (1, "2020- 01-02 ') y (1, "01/04/2020") llevaron a cabo una transacción, por lo visits_count = 5.
* Para transactions_count = 2, sin el acceso del cliente al banco llevó a cabo dos operaciones, por lo visits_count = 0.
* Para transactions_count = 3, visitas (9, "25/01/2020") llevado a cabo tres operaciones, por lo visits_count = 1.
* Para transactions_count> = 4, no hay acceso a los clientes de los bancos eran más de tres veces la operación, así que paramos en transactions_count = 3.

Fuente: estancia botón (LeetCode)
enlace: https: //leetcode-cn.com/problems/number-of-transactions-per-visit
propiedad de la deducción de todas las redes. reimpresión comercial póngase en contacto con la reimpresión autorizada oficial, no comercial por favor indique la fuente.

Moderación: La primera tabla es visitar la mesa, registrar cada visita, pero no necesariamente la transacción, la segunda grabación de información de la transacción mesa. Consulta 0 veces negocian, como el número uno.

El primer registro de la tabla visita de un día, pero algunas personas en la misma transacción varias veces al día.

Pensando:

La resolución de problemas:

En primer lugar, para cada visita a cada usuario, un número total de transacción (transacción) se puede obtener en el siguiente SQL:

SELECT IFNULL(cnt, 0) cnt, COUNT(*) num FROM Visits t1 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t2
ON t1.user_id=t2.user_id AND visit_date=transaction_date GROUP BY IFNULL(cnt, 0)
-- 练习
select ifnull(cnt,0) cnt, count(*) num from visits t1 left join 
-- 查询这个id在这个日期下有几次交易。
(select user_id, transaction_date,count(*) cnt from Transactions 
group by user_id,transaction_date)t2
--
on t1.user_id = t2.user_id and visit_date = transaction_date group by ifnull(cnt,0)

Entonces, es necesario para generar una tabla de 0 a un valor máximo por encima de este (a N) y su tabla para JOIN, para obtener el resultado final. Teniendo en cuenta el número máximo aparecen, ciertamente no más de unas pocas filas de mesas de transacción, la tabla abierta Transacción:

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := -1) b

Luego dejar que el número es inferior a igual al valor máximo, el valor máximo se puede obtener este SQL:

SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date

 Digital tabla SQL generado se convierte en:

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := -1) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi

Pero hay un problema de este tipo, si la transacción está vacía, 0 no abrir estos datos, por lo que lo manejan, por lo que @tdesde el principio, y luego UNIÓN manualmente una fila 0 resultados:

SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := 0) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi 
 UNION SELECT 0

A continuación, el medidor digital y el comienzo de la conexión se pueden dejar en la Tabla 1:

SELECT CEIL(id) transactions_count, IFNULL(num, 0) visits_count FROM
(SELECT (@t := @t+1) AS id FROM Transactions t0, (SELECT @t := 0) b,
(SELECT MAX(cnt) maxi FROM Visits t11 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t21
ON t11.user_id=t21.user_id AND visit_date=transaction_date) t31 WHERE @t < maxi 
 UNION SELECT 0) t33
LEFT JOIN
(SELECT IFNULL(cnt, 0) cnt, COUNT(*) num FROM Visits t1 LEFT JOIN
(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date)t2
ON t1.user_id=t2.user_id AND visit_date=transaction_date GROUP BY IFNULL(cnt, 0)) t3
ON t33.id=t3.cnt ORDER BY id

 El conocimiento Point: Esta pregunta es más difícil, es necesario continuar la comprensión en profundidad de las

Publicados 144 artículos originales · ganado elogios 2 · Vistas 5730

Supongo que te gusta

Origin blog.csdn.net/Hello_JavaScript/article/details/104789422
Recomendado
Clasificación