db2 重置DENSE_RANK()OVER分区,其中只有一行不同

jrcvhitl  于 2023-10-18  发布在  DB2
关注(0)|答案(1)|浏览(169)

我拥有的数据集在日期之间有差距,我用Lag()函数计算了存在差距的月份数。然后在第二个查询中使用dense_rank(),我为每个ID计算活跃月份。然而,正如您在表中看到的,计数在有间隙的地方重置,但在此之后,它继续使用先前的计数而不是重置的数字。
你能帮帮我吗?

SELECT
    GP, ID, Date, 
    DENSE_RANK() OVER (PARTITION BY ENR.GP, ENR.ID, Age, ENR.DATEDIFF 
                       ORDER BY ENR.DATE ASC) AS Active_MOS
FROM
    (SELECT 
         GP, ID, 
         MONTHS_BETWEEN (DATE, LAG(DATE, 1) OVER (PARTITION BY GP, ID, CASE WHEN GNDR = 'M' AND AGE < 35 THEN 'YES' ELSE 'NO' END ORDER BY YRMO ASC )) AS DateDiff
     FROM 
         TABLE2)

9udxz4iz

9udxz4iz1#

你必须给每个岛给予一个数字,并把它放在dense_rank的分区中。如果您设置一个值为1,当一行不跟随前一行时,则该值的累积和可以用作岛的编号:

with
--table2 (gp, id, age, date) as (
--  values
--  (33, 1375, 1, date '2021-05-01'),
--  (33, 1375, 2, date '2021-06-01'),
--  (33, 1375, 2, date '2021-07-01'),
--  (33, 1375, 2, date '2021-08-01'),
--  (33, 1375, 2, date '2021-09-01'),
--  (33, 1375, 2, date '2021-10-01'),
--  (33, 1375, 2, date '2021-11-01'),
--  (33, 1375, 2, date '2021-12-01'),
--  (33, 1375, 2, date '2022-01-01'),
--  (33, 1375, 2, date '2022-02-01'),
--  (33, 1375, 2, date '2022-03-01'),
--  (33, 1375, 2, date '2022-04-01'),
--  (33, 1375, 2, date '2022-05-01'),
--  (33, 1375, 2, date '2022-06-01'),
--  (33, 1375, 2, date '2022-07-01'),
--  (33, 1375, 2, date '2022-08-01'),
--  (33, 1375, 2, date '2022-09-01'),
--  (33, 1375, 2, date '2023-05-01'),
--  (33, 1375, 2, date '2023-06-01'),
--  (33, 1375, 2, date '2023-07-01')
--),
islands as (
  select
    t2.*,
    sum(
      case when t2."DATE" - 1 month
                > lag(t2.date, 1) over(partition by gp, id, age order by date)
           then 1 else 0 end
    ) over(partition by gp, id, age order by date) island_no
  from table2 t2
)
select
  islands.*,
  dense_rank() over(partition by gp, id, age, island_no order by date) rank
from islands

相关问题