1

我正在使用一个表,每个客户有几十行,每行都有一个日期和几个代表各种状态的列。我只对拉取某一特定列中发生更改的行感兴趣(特别是 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
4

2 回答 2

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
于 2013-09-13T02:28:46.700 回答
0

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

来自客户a,客户b

其中 a.CustomerID = b.CustomerID 和 a.status <> b.status 和 a.date < b.date

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

于 2013-09-13T02:24:43.167 回答