sql - Función LAG para tomar solo la fecha anterior a la ejecución en secuencia exacta

CorePress2024-01-24  12

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare