理解DATEDIFF + LAG的含义

understand the meaning of DATEDIFF + LAG

我需要了解这个计算的含义:

DATEDIFF(days, lag(recday, 1) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 

对于没有 datediff 的 Amazon Redshift,我如何在不使用 lagdatediff 的情况下实现它。

这是完整的查询:

SELECT udid
         ,recday AS day
         ,count(*) AS session_count
         ,DATEDIFF(days, lag(recday, 1) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction1
       ,DATEDIFF(days, lag(recday, 2) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction2
         ,DATEDIFF(days, lag(recday, 3) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction3
       ,DATEDIFF(days, lag(recday, 4) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction4
          ,DATEDIFF(days, lag(recday, 5) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction5
        ,DATEDIFF(days, lag(recday, 6) OVER (PARTITION BY  udid
                                           ORDER BY recday), recday) 
          AS repeat_transaction6
   FROM   vvdays

这是我的数据的样子 -

10000001 2016-02-03 17:26:03.0 10000001 2016-02-08 21:36:07.0 10000001 2016-02-10 07:48:06.0 10000012 2016-02-06 22:06:42.0 10000012 2016-02-06 22:07:42.0 10000028 2016-02-04 13:18:48.0 10000028 2016-02-04 13:30:42.0 10000028 2016-02-04 13:30:55.0 10000028 2016-02-05 16:48:41.0 10000028 2016-02-05 16:58:34.0 10000028 2016-02-07 15:44:33.0 10000028 2016-02-07 16:29:00.0 10000039 2016-02-03 21:16:49.0 10000039 2016-02-03 21:17:50.0 10000039 2016-02-03 21:18:49.0 10000039 2016-02-03 21:19:49.0 10000039 2016-02-03 21:20:50.0 10000039 2016-02-03 21:21:50.0 10000039 2016-02-03 21:22:51.0 10000039 2016-02-03 21:23:53.0 10000039 2016-02-03 21:24:49.0 10000039 2016-02-03 21:25:50.0 10000039 2016-02-03 21:26:50.0 10000039 2016-02-03 21:27:49.0 10000039 2016-02-05 21:58:59.0 10000039 2016-02-05 21:59:58.0 10000039 2016-02-05 22:00:58.0 10000039 2016-02-05 22:01:58.0 10000039 2016-02-05 22:02:59.0 10000039 2016-02-05 22:03:58.0 10000039 2016-02-05 22:05:00.0 10000039 2016-02-05 22:05:58.0 10000039 2016-02-05 22:06:58.0

没有看到您的数据,我猜测您的 table 'vvdays' 包含两个字段 'udid' 和 'recday'。 LAG 函数根据 udid 获取第二、第三、第四、第五、第六和第七行数据。然后 DATEDIFF 将第一行 'recday' 与其他行进行比较,并 return 计算这两个日期之间的天数。

如何在 redshift 中复制它是另一个问题,您可以考虑使用 UNPIVOT 将前 7 个结果放入同一行,然后 运行 在字段本身上使用 DATEDIFF 等效函数。

编辑:好的,我设计了一种非常老套的方法来实现它;

创建临时 table 用于测试目的;

CREATE TABLE #vvdays (udid int, recday datetime)

插入一些数据编辑:现在使用 OP 提供的数据;

VALUES 
('10000001', '2016-02-03 17:26:03.0') 
,('10000001', '2016-02-08 21:36:07.0') 
,('10000001', '2016-02-10 07:48:06.0') 
,('10000012', '2016-02-06 22:06:42.0') 
,('10000012', '2016-02-06 22:07:42.0') 
,('10000028', '2016-02-04 13:18:48.0') 
,('10000028', '2016-02-04 13:30:42.0') 
,('10000028', '2016-02-04 13:30:55.0') 
,('10000028', '2016-02-05 16:48:41.0') 
,('10000028', '2016-02-05 16:58:34.0') 
,('10000028', '2016-02-07 15:44:33.0') 
,('10000028', '2016-02-07 16:29:00.0') 
,('10000039', '2016-02-03 21:16:49.0') 
,('10000039', '2016-02-03 21:17:50.0') 
,('10000039', '2016-02-03 21:18:49.0') 
,('10000039', '2016-02-03 21:19:49.0') 
,('10000039', '2016-02-03 21:20:50.0') 
,('10000039', '2016-02-03 21:21:50.0') 
,('10000039', '2016-02-03 21:22:51.0') 
,('10000039', '2016-02-03 21:23:53.0') 
,('10000039', '2016-02-03 21:24:49.0') 
,('10000039', '2016-02-03 21:25:50.0') 
,('10000039', '2016-02-03 21:26:50.0') 
,('10000039', '2016-02-03 21:27:49.0') 
,('10000039', '2016-02-05 21:58:59.0') 
,('10000039', '2016-02-05 21:59:58.0') 
,('10000039', '2016-02-05 22:00:58.0') 
,('10000039', '2016-02-05 22:01:58.0') 
,('10000039', '2016-02-05 22:02:59.0') 
,('10000039', '2016-02-05 22:03:58.0') 
,('10000039', '2016-02-05 22:05:00.0') 
,('10000039', '2016-02-05 22:05:58.0') 
,('10000039', '2016-02-05 22:06:58.0')

让这个工作真正可怕的查询。由于您提到的限制以及我对亚马逊特定知识的缺乏,我在下面为您完成了前两个值。如果你这样做,你最终会得到一个庞大的声明,但它会起作用。我强烈建议您进一步研究,看看您可以使用哪些等效功能;

SELECT day1.udid
    ,MAX(day1.recday) day1
    ,MAX(day2.recday) day2
    ,DATEDIFF(day,MAX(day2.recday),MAX(day1.recday)) Day2Diff
    ,MAX(day3.recday) day3
    ,DATEDIFF(day,MAX(day3.recday),MAX(day1.recday)) Day3Diff
FROM #vvdays day1
LEFT JOIN (
    SELECT a.udid
        ,MAX(a.recday) recday
    FROM #vvdays a
    LEFT JOIN (
        SELECT udid
            ,MAX(recday) recday
        FROM #vvdays
        GROUP BY udid
        ) b ON a.udid = b.udid
    WHERE a.recday <> b.recday
    GROUP BY a.udid
    ) day2 ON day1.udid = day2.udid
LEFT JOIN (
    SELECT a.udid
        ,MAX(a.recday) recday
    FROM #vvdays a
    LEFT JOIN (
        SELECT udid
            ,MAX(recday) recday
        FROM #vvdays
        GROUP BY udid
        ) b ON a.udid = b.udid
    LEFT JOIN (
    SELECT a.udid
        ,MAX(a.recday) recday
    FROM #vvdays a
    LEFT JOIN (
        SELECT udid
            ,MAX(recday) recday
        FROM #vvdays
        GROUP BY udid
        ) b ON a.udid = b.udid
    WHERE a.recday <> b.recday
    GROUP BY a.udid
    ) day2 ON a.udid = day2.udid
    WHERE a.recday NOT IN (b.recday, day2.recday)
    GROUP BY a.udid
    ) day3 ON day1.udid = day3.udid
GROUP BY day1.udid

我在 'day1' 中使用 MAX 的原因是 return 第一次约会。我在顶层的 'day2' 中使用它纯粹是为了将它变成一个聚合字段,你在这里只会得到一个结果,它是一个错误的聚合,只是让 GROUP BY 正常工作。