【问题标题】:window function based on condition基于条件的窗口函数
【发布时间】:2020-08-07 16:01:11
【问题描述】:

输入表如下:

column1         column2         column3         column4
230             8979            abc             mno
228             8979            abc             mno
227             6578            abc             mno
226             6578            abc             mno
225             6578            abc             mno
224             6578            abc             mno
223             6578            abc             mno
222             6578            def             pqr

是否可以生成输出列,其中行号是根据条件生成的 - 仅当 column1 中的值按顺序排列时,按 column2、column3 和 column4 分区的行号,按 column1 排序。如果不按顺序,则必须生成一组新的行号。

要生成的输出

column1         column2         column3         column4       output
230             8979            abc             mno           1       
228             8979            abc             mno           1
227             6578            abc             mno           5
226             6578            abc             mno           4
225             6578            abc             mno           3
224             6578            abc             mno           2
223             6578            abc             mno           1
222             6578            def             pqr           1

【问题讨论】:

    标签: sql window-functions


    【解决方案1】:

    您可以使用 row_number 按 column2,column3,column4 获取每个分区的编号 然后获取序列组(column1 - num):

      select X.column1,X.column2,X.column3,X.column4,
               row_number() over (partition by column2,column3,column4, column1 - num
                                  order by column1
                                 ) as needed_number
        from (select t.*,
                     row_number() over (partition by column2,column3,column4 order by column1) as num
                   
              from Table t
             ) X
      order by column1 desc
    

    【讨论】:

      【解决方案2】:

      使用以下查询并删除不需要的列

      SQLFiddle

      SELECT T.*, CASE WHEN COLUMN1 <> PREV_NUM + 1 THEN 1 ELSE RANK() OVER(PARTITION BY COLUMN2, COLUMN3, COLUMN4 ORDER BY COLUMN1, COLUMN2 DESC, COLUMN3, COLUMN4) END AS NEW_RANK FROM (
      SELECT A.*, LEAD(COLUMN1) OVER(PARTITION BY COLUMN2, COLUMN3, COLUMN4 ORDER BY COLUMN1 DESC, COLUMN2 DESC) PREV_NUM
      FROM TABLE1 A ORDER BY 1 DESC) T ORDER BY 1 DESC;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-12
        • 2016-02-11
        • 1970-01-01
        • 2022-01-26
        • 2022-08-16
        • 2021-09-26
        • 2018-01-25
        • 2021-07-12
        相关资源
        最近更新 更多