+-----------+----------------------+-----------------------+-----------------------+
| review_id |      old_group       |       new_group       |    desired_result     |
+-----------+----------------------+-----------------------+-----------------------+
|         1 | null                 | null                  | BATCH                 |
|         2 | null                 | null                  | BATCH                 |
|         3 | BATCH                | LEVEL_1               | LEVEL_1               |
|         4 | null                 | null                  | LEVEL_1               |
|         5 | LEVEL_1              | LEVEL_2               | LEVEL_2               |
|         6 | LEVEL_2              | L3                    | LEVEL_3               |
|         7 | null                 | null                  | LEVEL_3               |
|         8 | null                 | null                  | LEVEL_3               |
|         9 | null                 | null                  | LEVEL_3               |
+-----------+----------------------+-----------------------+-----------------------+

我在snowflake中工作,需要写一个SQL查询,基于一个new_group和old_group将创建一个新的列填补空白 每个评审都分配了一个新的和旧的组,我需要组合这些值,以便有一个单独的列,显示该评审的特定评审组.

我试过 FIRST_value(new_group忽略空)OVER(Order BY review_id ROWS between current Row and unbounded folLOWING)但是,它没有提供正确的结果:最后的 comments 是空的,因为没有即将到来的组,并且 comments 有点偏移.

推荐答案

这里有一种方法,它使用LAG()技巧来检测NULL个缺失值的新块何时开始和结束,以用该组中的非NULL值填充.

WITH cte1 AS (
    SELECT t.*,
        CASE WHEN old_group IS NOT NULL AND
                  (LAG(old_group) OVER (ORDER BY review_id) IS NULL OR
                   LAG(old_group) OVER (ORDER BY review_id) <> old_group)
             THEN 1 ELSE 0 END AS old_flag,
        CASE WHEN new_group IS NOT NULL AND
                  (LAG(new_group) OVER (ORDER BY review_id) IS NULL OR
                   LAG(new_group) OVER (ORDER BY review_id) <> new_group)
             THEN 1 ELSE 0 END AS new_flag
    FROM yourTable t
),
cte2 AS (
    SELECT t.*, SUM(old_flag) OVER (ORDER BY review_id) AS old_grp,
                SUM(new_flag) OVER (ORDER BY review_id) AS new_grp
    FROM cte1 t
)

SELECT review_id, old_group, new_group,
       COALESCE(MAX(new_group) OVER (PARTITION BY new_grp),
                MAX(CASE WHEN new_grp = 1 THEN old_group END) OVER ()) AS desired_result
FROM cte2
ORDER BY review_id;

screen capture from demo link below

演示

Sql相关问答推荐

如何查询未命名对象的SON数组

按postquist中的日期查询json列

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

在SQL中将相同且紧挨着的元素进行分组

DBeaver将过程中的属性列表转换为字符串

仅当交叉应用返回单值时才更新记录

以一致的价值获得独特的价值

SQL数据库规范化与数据插入

PostgreSQL-按距离阈值挤压相邻行的性能

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

将伪数据插入Postgres表

插入具有预期逻辑的查询以Forking 表

根据时间值提取记录

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

如何在 SQL Server 中解决这个复杂的窗口查询?

INSERT INTO 语法

SQL Server - 复杂场景 - 比较状态并填充值到后续行

如何显示最常引用条目的详细信息

MIN MAX 值与条件绑定

在 postgresql 中,我可以将其组合成一个查询吗?