【问题标题】:Row_num and Partition by DATE?Row_num 和 DATE 分区?
【发布时间】:2016-03-03 23:38:37
【问题描述】:

我正在努力寻找使用row_numberpartition by 的解决方案。

我的表格是这样的(*这是我唯一的一列*)

我的脚本是这样的:

SELECT 
    [P_ID],
    [DATE],
    ROW_NUMBER() OVER (PARTITION BY P_ID,[DATE] ORDER BY P_ID,[DATE] ) AS ROW
FROM #TEMP

我想按 DATE 分组,第一行应该说 1,第二行也应该说 1,但第三行应该说 2,因为日期(顺序)是 15,然后是 16,如果有 17,那么行会说3 但如果有一个新行显示 2015-09-21 那么它将返回到第 1 行,依此类推....

这可以通过分区来实现吗?

【问题讨论】:

  • 一般而言,如果PARTITION BYORDER BY 中的列相同,则说明您做错了。
  • 我本来是要讽刺的,但后来我意识到所有的答案都是很好的答案,所以谢谢你:)
  • 请忽略,错误,对不起
  • 您在图像中显示 3 个不同的日期,因此这三行中的每一行都会得到 1 个(图像和文本在细节上没有对齐)。
  • 您想要遍历多行并检查差异并为行列赋值 - 您需要一个存储过程。

标签: sql sql-server date sql-server-2012 window-functions


【解决方案1】:

这是一个使用孤岛和间隙解决方案的解决方案:

DECLARE @t TABLE ( id INT, date DATE )
INSERT  INTO @t
VALUES  ( 2143, '20150902' ),
        ( 2143, '20150915' ),
        ( 2143, '20150916' ),
        ( 2143, '20150917' ),
        ( 2144, '20150902' ),
        ( 2144, '20150903' ),
        ( 2144, '20150916' ),
        ( 2144, '20150917' );

WITH    cte1
          AS ( SELECT   id ,
                        date ,
                        ROW_NUMBER() OVER ( PARTITION BY id ORDER BY date ) i
               FROM     @t
               GROUP BY id ,
                        date
             ),
        cte2
          AS ( SELECT   id ,
                        MIN(date) mi ,
                        MAX(date) ma ,
                        ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL
                                                     ) ) rn
               FROM     cte1
               GROUP BY id ,
                        DATEDIFF(DAY, i, date)
             )
    SELECT  t.* ,
            ROW_NUMBER() OVER ( PARTITION BY t.id, c.rn ORDER BY date )
    FROM    @t t
            JOIN cte2 c ON t.id = c.id
                           AND t.date BETWEEN c.mi AND c.ma

输出:

2143    2015-09-02  1
2143    2015-09-15  1
2143    2015-09-16  2
2143    2015-09-17  3
2144    2015-09-02  1
2144    2015-09-03  2
2144    2015-09-16  1
2144    2015-09-17  2

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2018-06-15
    • 1970-01-01
    • 2018-11-09
    • 2017-02-14
    相关资源
    最近更新 更多