如何查询只获取发生更改的行? (变化可以来回)

时间:2013-09-13 01:38:46

标签: sql sql-server date partitioning

我正在使用一个每个客户有几十行的表,每个表都有一个日期和几个代表各种状态的列。我只想拉动在一个特定列中发生更改的行(特别是0到1或1到0,请参见下面的状态列)。

我不能简单地使用row_number() over (partition by customer_id, status order by date),因为状态可以在0和1之间来回传递。

以下是我正在尝试做的一个示例(请注意,此示例中有两个不同的客户ID):

原始表

Row     CustomerID    Status    Date

1                ABC    0   3/12/2013 
2                ABC    0   3/31/2013
3                ABC    1   4/13/2013
4                ABC    1   4/15/2013
5                ABC    1   5/17/2013
6                ABC    0   6/25/2013
7                ABC    0   6/28/2013
8                XYZ    0   8/2/2013
9                XYZ    1   5/10/2013
10               XYZ    0   5/18/2013
11               XYZ    1   8/23/2013
12               XYZ    1   9/7/2013

所需的查询输出

Customer ID Status  Date
ABC            1    4/13/2013
ABC            0    6/25/2013
XYZ            1    5/10/2013
XYZ            0    5/18/2013
XYZ            1    8/23/2013

2 个答案:

答案 0 :(得分:1)

您与ROW_NUMBER走在了正确的轨道上。在像你这样的情况下将表连接到自身特别有用。

以下内容可为您提供所需内容:

WITH CTE AS ( 
    SELECT  Row, 
            CustomerID, 
            Status, 
            Date, 
            ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY Row) AS N
    FROM    OriginalTable
)

SELECT  A.CustomerID, 
        A.Status,
        A.Date
FROM    CTE A
JOIN    CTE B 
    ON  A.N = B.N+1
    AND A.CustomerID = B.CustomerID
WHERE   A.Status <> B.Status
ORDER BY 
        A.Row

答案 1 :(得分:0)

选择不同的b.CustomerID,b.status,min(b.date)

来自客户a,客户b

其中a.CustomerID = b.CustomerID和a.status&lt;&gt; b.status和a.date&lt; b.date

按b.CustomerID分组,b.status,a.date;