Sql server 2012 sql server摘要或组数据

Sql server 2012 sql server摘要或组数据,sql-server-2012,Sql Server 2012,我在SQL中有一个摘录,我想在所需的输出列中按下表所示的格式对数据进行分组/排序。我的问题是如何做到这一点。我尝试过秩函数和稠密秩函数,但它并没有给我想要的结果 Cusomter|u Id | Rno | Start|u Dt | End|u Dt | PM|u Status |所需| u输出 ------------------------------------------------------------------------- 1609 | 1 | 02/10/2014 | 08/1

我在SQL中有一个摘录,我想在所需的输出列中按下表所示的格式对数据进行分组/排序。我的问题是如何做到这一点。我尝试过秩函数和稠密秩函数,但它并没有给我想要的结果

Cusomter|u Id | Rno | Start|u Dt | End|u Dt | PM|u Status |所需| u输出
-------------------------------------------------------------------------
1609 | 1 | 02/10/2014 | 08/10/2014 | VD | 1
-------------------------------------------------------------------------
1609 | 2 | 09/10/2014 | 02/11/2014 | CC | 2
-------------------------------------------------------------------------
1609 | 3 | 03/11/2014 | 04/11/2014 | CC | 2
-------------------------------------------------------------------------
1609 | 4 | 05/11/2014 | 27/01/2015 | FD | 3
-------------------------------------------------------------------------
1609 | 5 | 28/01/2015 | 02/02/2015 | CC | 4
-------------------------------------------------------------------------
1609 | 6 | 03/02/2015 | 09/02/2015 | CC | 4
-------------------------------------------------------------------------
1609 | 7 | 10/02/2015 | 31/12/9999 | CC | 4
-------------------------------------------------------------------------

我希望以上数据有意义。如有任何问题,请告诉我


非常感谢您查看我的查询。

您可以使用递归CTE查找分组并获得所需结果:

DECLARE @Data TABLE (
    Customer_Id INT,
    Rno INT,
    Start_Dt DATE,
    End_Dt DATE,
    PM_Status VARCHAR(5),
    Desired INT
)
INSERT @Data VALUES
    (1609, 1, '2/10/2014', '10/8/2014', 'VD', 1),
    (1609, 2, '10/9/2014', '11/2/2014', 'CC', 2),
    (1609, 3, '11/3/2014', '11/4/2014', 'CC', 2),
    (1609, 4, '11/5/2014', '1/27/2014', 'FD', 3),
    (1609, 5, '1/28/2015', '2/2/2015', 'CC', 4),
    (1609, 6, '2/3/2015', '2/9/2015', 'CC', 4),
    (1609, 7, '2/10/2015', NULL, 'CC', 4)

; WITH CTE AS (
    SELECT
        Customer_id,
        Rno,
        Start_Dt,
        End_Dt,
        PM_Status,
        Desired,
        1 AS Actual
    FROM @Data
    WHERE RNo = 1
    UNION ALL
    SELECT
        SRC.Customer_id,
        SRC.Rno,
        SRC.Start_Dt,
        SRC.End_Dt,
        SRC.PM_Status,
        SRC.Desired,
        CASE WHEN CTE.PM_Status <> SRC.PM_Status 
            THEN CTE.Actual + 1 ELSE CTE.Actual END
    FROM CTE
        INNER JOIN @Data SRC
            ON SRC.Customer_Id = CTE.Customer_Id
                AND SRC.Rno = CTE.Rno + 1
)
SELECT *
FROM CTE

我有个问题-你想做什么?请编辑您的问题,并描述您正试图实现的目标;假设你正在从我们的角度阅读你的问题,并试图解释你想要的结果背后的逻辑。很抱歉,我在描述我的问题时不清楚。我想根据PM_状态对数据进行排序/分组,以获得PM_状态各部分的最小值和最大值。例如,如果您看到PM_状态“CC”,则在两个不同的时间段内发生,如果我仅按PM_状态分组,以获取每个PM_状态的开始和结束dt的最小值和最大值,则这是不正确的。因为“FD”在中间有另一个PM_状态。理想情况下,如果我能按照预期输出对PM_状态的发生进行排名,这将有助于我获得结果,我可以根据预期输出对开始和结束dt的最小值和最大值进行分组。非常感谢Jason,这是正确的。很高兴它对您有效。如果你对这个问题的答案感兴趣,请随意投票或接受它。只需单击我的答案旁边的向左上箭头。这是帮助本网站成功显示已接受(单击答案旁边的复选标记)和向上投票(答案旁边的箭头向上)的一部分,这样其他有类似问题的人可以找到你的问题,并希望帮助他们。
Customer_id Rno         Start_Dt   End_Dt     PM_Status Desired     Actual
----------- ----------- ---------- ---------- --------- ----------- -----------
1609        1           2014-02-10 2014-10-08 VD        1           1
1609        2           2014-10-09 2014-11-02 CC        2           2
1609        3           2014-11-03 2014-11-04 CC        2           2
1609        4           2014-11-05 2014-01-27 FD        3           3
1609        5           2015-01-28 2015-02-02 CC        4           4
1609        6           2015-02-03 2015-02-09 CC        4           4
1609        7           2015-02-10 NULL       CC        4           4