Tengo el requisito de encontrar la fecha de visita anterior del cliente en una tienda a partir de la fecha de visita.
SELECT
CUSTOMER,
STORE,
VISIT_DATE,
LAG(VISIT_DATE)
OVER (partition by CUSTOMER ORDER BY CUSTOMER_CODE,VISIT_DATE ASC )
PREVIOUS_VISIT_DATE,
DATEDIFF(d,
LAG(VISIT_DATE)
OVER (partition by CUSTOMER ORDER BY CUSTOMER_CODE,VISIT_DATE ASC),
VISIT_DATE) DAYDIFFERENCE
FROM CUSTOMER_DETAILS;
[Salida actual][1]
[1]: https://i.stack.imgur.com/Iul9P.png
Cliente
Fecha de visita
AnteriorVisitaFecha
Diferencia de día
Jacobo
05-01-2020
NULO
0
Jacobo
06-01-2020
05-01-2020
1
Jacobo
07-01-2020
06-01-2020
1
Jacobo
07-01-2020
07-01-2020
1
Jacobo
08-01-2020
07-01-2020
1
Jacobo
09-01-2020
08-01-2020
1
Jacobo
09-01-2020
09-01-2020
1
[Resultado esperado][2]
[2]: https://i.stack.imgur.com/oL2lN.png
| Customer | Visit Date | PreviousVisitDate | DayDifference|
|:---------|:-----------:|:-----------------:|-------------:|
|Jack | 05-01-2020 | NULL | 0|
|jack | 06-01-2020 | 05-01-2020 | 1|
|jack | 07-01-2020 | 06-01-2020 | 1|
|jack | 07-01-2020 | 06-01-2020 | 1|
|jack | 08-01-2020 | 07-01-2020 | 1|
|jack | 09-01-2020 | 08-01-2020 | 1|
|jack | 09-01-2020 | 08-01-2020 | 1|
------------------------------------
--
La fecha de la visita anterior aparece en secuencia, pero quiero el día anterior exacto. ¿Cómo se puede solucionar?
------------------------------------
¿El día anterior independientemente de si el cliente visitó entonces? ¿O la fecha_de_visita_anterior?
4
Debe ser la fecha de la visita anterior,
- Lionel
26/03/2021 a las 20:24
En tu ORDER BY, ¿por qué incluyes CUSTOMER_CODE? Ver la come de Kazint arriba.
-Kay
26/03/2021 a las 21:00
CUSTOMER_CODE fue un error tipográfico. Pero mi requisito aún no se cumple. La fecha de la visita anterior debe ser exactamente la fecha de la visita anterior, incluso si la fecha de la visita se repite
- Lionel
27 de marzo de 2021 a las 3:17
Parece que es posible que necesites AGRUPAR POR usuario y visit_day ORDENAR POR visit_day. Para cada combinación de grupo yoEntonces tendrías solo un día de visita anterior.
-Kay
30/03/2021 a las 18:45
------------------------------------
SELECT
CUSTOMER,
STORE,
VISIT_DATE,
LAG(VISIT_DATE) OVER (partition by CUSTOMER ORDER BY VISIT_DATE ASC ) PREVIOUS_VISIT_DATE,
DATEDIFF(d,LAG(VISIT_DATE) OVER (partition by CUSTOMER ORDER BY VISIT_DATE ASC),VISIT_DATE) DAYDIFFERENCE
FROM CUSTOMER_DETAILS;
Para que la última fecha_visita sea menor que la fila actual VISIT_DATE:
SELECT
CUSTOMER,
VISIT_DATE,
(select max (visit_date) from CUSTOMER_DETAILS C WHERE C.visit_date<CD.visit_date)PREVIOUS_VISIT_DATE,
DATEDIFF(d,(select max (visit_date) from CUSTOMER_DETAILS C WHERE C.visit_date<CD.visit_date),VISIT_DATE) DAYDIFFERENCE
FROM CUSTOMER_DETAILS cd
Salida:
| CUSTOMER | VISIT_DATE |PREVIOUS_VISIT_DATE|DAYDIFFERENCE|
|----------|------------|-------------------|-------------|
| Jack | 2020-05-01 | NULL | NULL |
| jack | 2020-06-01 | 2020-05-01 | 31 |
| jack | 2020-07-01 | 2020-06-01 | 30 |
| jack | 2020-08-01 | 2020-07-01 | 31 |
| jack | 2020-09-01 | 2020-08-01 | 31 |
| jack | 2020-09-01 | 2020-08-01 | 31 |
3
CUSTOMER_CODE fue un error tipográfico. Pero mi requisito aún no se cumple. La fecha de la visita anterior debe ser exactamente la fecha de la visita anterior, incluso si la fecha de la visitae repite
- Lionel
27 de marzo de 2021 a las 3:15
He revisado mi respuesta. Por favor, compruébalo.
- Kazi Mohammad Ali Nur Romel
27 de marzo de 2021 a las 5:44
@Lionel, avíseme si tiene más dificultades con esta consulta:
-Kazi Mohammad Ali Nur Romel
30 de marzo de 2021 a las 5:03