DB2:标记第一个事件和最后一个标记事件之后60天的行

1sbrub3j  于 2023-03-02  发布在  DB2
关注(0)|答案(1)|浏览(157)

我有一个数据集,看起来像这样:
| 用户ID|访视日期|
| - ------|- ------|
| 零零一|2021年1月1日|
| 零零一|2021年2月7日|
| 零零一|2021年3月6日|
| 002|2021年2月8日|
| 002|2022年6月3日|
| 零零三|2021年4月9日|
| 零零三|2021年5月4日|
我需要创建一个逻辑,将标记为NewVisit每个用户的第一次访问,然后还标记行,如果它超过60天以来,最后一次"NewVisit"。
| 用户ID|访视日期|新访视|
| - ------|- ------|- ------|
| 零零一|2021年1月1日|1个|
| 零零一|2021年2月7日|无|
| 零零一|2021年3月6日|1个|
| 002|2021年2月8日|1个|
| 002|2022年6月3日|1个|
| 零零三|2021年4月9日|1个|
| 零零三|2021年5月4日|无|
我试过使用滞后/超前,但我想我漏掉了一些东西。

inb24sb2

inb24sb21#

使用MAX OLAP函数更容易。

WITH MYTAB (UserID, VisitDate) AS
(
VALUES 
  ('001', DATE (TO_DATE ('1/1/21', 'MM/DD/YY')))
, ('001', DATE (TO_DATE ('2/7/21', 'MM/DD/YY')))
, ('001', DATE (TO_DATE ('3/6/21', 'MM/DD/YY')))
, ('002', DATE (TO_DATE ('2/8/21', 'MM/DD/YY')))
, ('002', DATE (TO_DATE ('6/3/22', 'MM/DD/YY')))
, ('003', DATE (TO_DATE ('4/9/21', 'MM/DD/YY')))
, ('003', DATE (TO_DATE ('5/4/21', 'MM/DD/YY')))
)
SELECT 
  UserID
, VisitDate
, CASE 
    WHEN 
      VisitDate = VisitDate_max 
      OR DAYS (VisitDate_max) - DAYS (VisitDate) > 60
    THEN 1
    ELSE 0
  END AS NewVisit
FROM 
(
SELECT 
  *
, MAX (VisitDate) OVER (PARTITION BY UserID) AS VisitDate_max
FROM MYTAB
)
ORDER BY UserID, VisitDate

| 用户ID|访视日期|新访视|
| - ------|- ------|- ------|
| 零零一|2021年1月1日|1个|
| 零零一|2021年2月7日|无|
| 零零一|二○二一年三月六日|1个|
| 002|2021年2月8日|1个|
| 002|2022年6月3日|1个|
| 零零三|二○二一年四月九日|无|
| 零零三|2021年5月4日|1个|
fiddle

相关问题