SQL - Patrón de compra por días

 
Vista:
sin imagen de perfil
Val: 12
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Patrón de compra por días

Publicado por Oscar (7 intervenciones) el 21/07/2018 10:52:02
Buenas, mi primer post. Agradecería mucho vuestra ayuda.

Tengo una Tabla de registros SQL de la que averiguar el patrón de compra de los Clientes por día. Necesito saber:
Cuántas veces, un Cliente, en este caso "A", realiza compras sin salir del establecimiento o saliendo y volviendo a entrar.

Es decir, si entre horas del mismo día tarda menos de 1 hora en comprar se asume que no ha salido.
Si tarda más de 1 hora representa que se marcha y vuelve después.

Adjunto imagen de ejemplo de Tabla + resultado esperado.

Muchas gracias por adelantado.
Imagen-2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Patrón de compra por días

Publicado por leonardo_josue (1173 intervenciones) el 23/07/2018 16:17:40
Hola Oscar:

Dado que este es tu primer post en el foro, vale la pena hacerte algunas observaciones y recomendaciones.

1. Dado que este es un foro de SQL Genérico, es importante que digas siempre en tus post's con que Motor de Base de Datos estás trabajando así como la versión/edición del mismo, ya que cada DBMS maneja una sintaxis distinta, sobre todo en el manejo de fechas.
2. Siempre postea cual es la estructura de tus tablas. Cuando pones sólo los datos, podemos deducir equivocadamente los TIPOS de cada columna. Aquí por ejemplo no nos dices de qué TIPO son tus columas de fecha y hora, además, los tipos de datos pueden variar de un DBMS a otro, así por ejemplo, MySQL tiene los tipos TIME, DATE, DATETIME para almacenar fechas mientras que otros sólo maneja el tipo DATE. Peor aun, algunos usuarios tienen la mala práctica de usar columnas tipo VARCHAR para almacenar sus fechas espero que no sea el caso)
3. Utiliza las herramientas de búsqueda como Google o la propia de este foro para ver si alguien más ya posteo un problema similar que pueda ayudarte. Sólo si de plano no encuentras nada de ayuda que te pueda servir, entonces puedes acudir al foro y abrir una nueva pregunta.
4. En tus post's siempre incluye el código que intentaste hacer por tu cuenta, no importa si está mal, o si está incompleto. El hecho es que demuestres que al menos trataste de obtener el resultado esperado. Si tu código marca algún error entonces posteas también el código de error que está marcando. Si tu código no regresa los resultados esperados entonces dinos qué es lo que te regresa y qué está mal contra el resultado esperado.
5. El post sirve para resolver dudas puntuales pero de ninguna manera esperes encontrar un código sólo para copiar y pegar. Aquí encontraras tips o ideas de lo que tienes que hacer, pero en definitiva, es tu trabajo y tendrás que hacerlo por tu cuenta.
6. Finalmente, con respecto a tu pregunta, en realidad tienes muchas formas de resolverla, la más simple creo que sería que sólo consideres la "HORA_COMPRA" a nivel de hora, no de minutos, es decir, que "TRUNQUES" los minutos:

1
2
3
4
5
6
7
8
9
10
11
+---------------+-------------+---------------+
| fecha_entrada | hora_compra | hora_truncada |
+---------------+-------------+---------------+
| 2018-06-14    | 10:00:00    | 10:00:00      |
| 2018-06-14    | 12:00:00    | 12:00:00      |
| 2018-06-14    | 15:00:00    | 15:00:00      |
| 2018-06-14    | 15:10:00    | 15:00:00      |
| 2018-06-14    | 15:20:00    | 15:00:00      |
| 2018-06-14    | 15:50:00    | 15:00:00      |
+---------------+-------------+---------------+
6 rows in set (0.01 sec)

Una vez que hagas esto, simplemente AGRUPAS por FECHA y HORA_TRUNCADA para obtener el resultado esperado.

El cómo hacer este "truncado" dependerá del DBMS con el que estés trabajando.

Haz la prueba y nos comentas. Si sigues con problemas, postea lo que intentaste hacer y con gusto te ayudamos a completar y/o corregir lo que haga falta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 12
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Patrón de compra por días

Publicado por Oscar (7 intervenciones) el 24/07/2018 19:00:19
Leo, en primer lugar, muchas gracias por tus comentarios y sugerencias, y disculpas por no haberme explicado mejor.

Tomo nota para futuras colaboraciones. Utilizo SQL 2016.

Mi código incluye Select anidado con Lag (registro anterior) y Lead (posterior), el problema estaba en que esas lecturas me mostraban valores repetidos que no entendía como tratar.

Con tu propuesta lo he visto muy claro y casi lo tengo. El único problema se me presenta si la compra se realiza entre dos horas diferentes y con diferencia de pocos minutos.

Ej. En este caso representaría que el Cliente no ha salido y ha realizado dos compras:

2018-06-14 -- 10:55 -- truncada: 10:00
2018-06-14 -- 11:02 -- truncada: 11:00
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar