【问题标题】:Row Number with specific window size具有特定窗口大小的行号
【发布时间】:2021-03-24 19:46:13
【问题描述】:

我想按行号对记录进行分组。

例如从第 1 组中的第 1-3 行、第 2 组中的第 4-6 行、第 3 组中的第 7-9 行等等。

假设下面是表结构:

Row NumberDataValue
1 A 10
2 A 5
3 A 1
4 A 33
5 A
2
6 A 127 kbd>
1 B 1
2 B 0
3 B 7
4 B 7
5 B 5
6 B 8
7 @98765436 1@1
8 B 0

我想要这样的输出:

GroupValue
1 10
1 5
1 @ 987654373@
2 33
2 2 kbd>
2 127
1 1
1 0
1 7
2 7
2 5
2 8
3 1
3 0

我使用的是 Oracle 11G。

我可以使用 PL/SQL 实现这一点。但我只能使用 SQL。因为我必须在报告工具中使用此查询。

如果这是一个重复的问题,请提供已回答问题的链接。

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    "RowNumber" 列中减去 1,然后除以 3。
    然后使用TRUNC()获取整数部分:

    SELECT TRUNC(("RowNumber" - 1) / 3) + 1 "Group",
           "Value"
    FROM tablename 
    

    请参阅demo

    【讨论】:

      【解决方案2】:

      我假设第一列的名称是ordering

      你可以这样做:

      select
        1 + trunc(row_number() over(partition by data order by ordering) - 1) / 3,
        value
      from t
      

      【讨论】:

        【解决方案3】:

        您显示的内容看起来像这样的输出:

        select ceil(rn/3) as grp, value
        from   your_table
        order  by rn;
        

        请注意,“行号”和“组”是保留字/短语,不应用作列名。我改用rngrp

        【讨论】:

          【解决方案4】:

          我认为天花板函数是达到你想要的最简单的方法。如果你想基于RowNumber 列:

          select ceil( RowNumber / 3.0) as grouping
          

          如果你想使用row_number()自己计算:

          select ceil( row_number() over (order by RowNumber) / 3.0 ) as grouping
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多