db2 如何按标志字段汇总天数?

oug3syen  于 2023-05-06  发布在  DB2
关注(0)|答案(2)|浏览(231)

如何使用标记字段总结凯尔在此表上的天数?
| 行|姓名|旗|天数|
| --------------|--------------|--------------|--------------|
| 1|凯尔|0|十二岁|
| 二|凯尔|0| 02|
| 三|凯尔|1| 01|
| 四个|凯尔|1|十八岁|
| 五|凯尔|1| 01|
| 六|凯尔|0| 01|
| 七|凯尔|1| 01|
| 八|凯尔|1| 01|
我想要这个结果:
| 行|姓名|旗|天数|
| --------------|--------------|--------------|--------------|
| 1|凯尔|0|十二岁|
| 二|凯尔|0| 02|
| 三|凯尔|1|二十|
| 六|凯尔|0| 01|
| 七|凯尔|1| 02|

des4xlb0

des4xlb01#

这看起来像是一个缺口和孤岛问题。如果我正确地遵循了这一点,我们可以通过行号之间的差异来识别“相邻”行,然后聚合启用了标志的岛:

select min(row) as row, name, flag, sum(days) as days
from (
    select t.*,
        row_number() over(partition by name order by row) rn1,
        row_number() over(partition by name, flag order by row) rn2
    from mytable t
) t
group by name, flag, 
    case when flag = 1 then rn1 - rn2 else row end
order by 1

Demo on DB Fiddle(感谢nbk创建用例)。

7jmck4yq

7jmck4yq2#

你可以使用窗口函数
首先,我们需要一个分组依据的组,这两个CTE都将提供

WITH CTE As(
SELECT
     Row, Name, Flag, Days
  , CASE WHEN Flag <> LAG(Flag) OVER(PARTITION BY Name ORDEr By row)
  OR LAG(Flag) OVER(PARTITION BY Name ORDEr By row) IS NULL THEN 1 ELSe 0 ENd rnk
FROM tab1),
CTE2 AS (SELECT
Row, Name, Flag, Days, SUM(rnk) OVER(ORDER BY row) rnk
FROM CTE)
SELECT 
    Row, Name, Flag, Days
FROM CTE2 WHERE Flag = 0
UNION ALL
SELECT 
    MIN(Row), Name, Flag, SUM(Days) as Days
FROM CTE2 WHERE Flag = 1
GROUP BY Name,Flag, rnk
ORDER By row
ROW名称FLAG天数
1凯尔0十二岁
凯尔0
凯尔1二十
凯尔01
凯尔1

fiddle

相关问题