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