【问题标题】:Grouping rows into one regarding an order关于订单将行分组为一个
【发布时间】:2022-01-22 18:37:35
【问题描述】:

我不太清楚如何描述这种情况,这可能就是我在谷歌上搜索它时遇到困难的原因。我什至不能说,如果这样的事情是可能的。我发现的方向正确的都是window functions,但是我不知道在这种情况下如何应用它。

我有一个看起来像这样的表格(加上一些与问题无关的字段):

CREATE TABLE item (marker VARCHAR(1), free TINYINT(1));

INSERT INTO item VALUES
('A', 1),
('B', 1),
('C', 0),
('D', 1),
('E', 1),
('F', 1),
('G', 0),
('H', 1),
('I', 0),
('J', 0);

我想知道如何编写一个查询(考虑ORDER BY marker

  • 按原样显示带有free = 0 的所有行
  • 并将所有连续的行与free = 1 合并到一个行中,其中包含已合并行范围的信息。

所以结果可能是这样的

marker last_marker free
A B 1
C null 0
D F 1
G null 0
H H 1
I null 0
J null 0

【问题讨论】:

    标签: sql mariadb


    【解决方案1】:

    是的,可以通过窗口函数来完成:

    with cte1 as (
        select *, case when free = 1 and lag(free) over (order by marker) = 1 then 0 else 1 end as grp_change
        from item
    ), cte2 as (
        select *, sum(grp_change) over (order by marker) as grp_number
        from cte1
    )
    select min(marker), case when free = 1 then max(marker) end, free
    from cte2
    group by grp_number, free
    

    它的工作原理如下:

    • 标记所有空闲 = 0 或(空闲 = 1 且前一行空闲 1)的行
    • 对标记的行进行连续求和以创建组编号
    • 按组号对数据进行分组

    DB<>Fiddle

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多