2015-11-27 28 views
2

我嘗試創建一個代碼片段以使用依賴於分組依據的子句。在SQL中使用分組按狀態摺疊歷史記錄按

所以我有什麼是一樣的東西 表1

Customer Status Date_FROM Date_TO 
A  1  1.11.15 2.11.1 
A  1  2.11.15 3.11.15 
...  ... ...  ... 
A  2  5.11.15 6.11.15 
...  ... ...  ... 
A  1  15.11.15 20.11.15 
A  2  20.11.15 27.11.15 

所以我得到了客戶不斷變化的狀態和時間最多的每日狀態行。因此,在一個簡單的場景(僅2間隔)我可以使用類似代碼:

select Customer, Status, min(Date_FROM), max(Date_TO) 
    from Table1 
    group by Customer, Status 

但我想在一個更復雜的情況是什麼

表2

Customer Status Date_FROM Date_TO 
A  1  1.11.15 5.11.15 
A  2  5.11.15 15.11.15 
A  1  15.11.15 20.11.15 
A  2  20.11.15 27.11.15 

是否有某種只要狀態(按Date_FROM排序)不會更改,就會執行聚合的分析型sql函數?

問候

帕特里克

+0

如果你有一個[sqlfiddle](http://sqlfiddle.com),我很高興。 –

+0

不確定你正在瞄準的是什麼,但是'滯後'可能是有趣的(在給定順序上匹配記錄'n'和'n-1',允許你識別何時發生狀態變化)以及'listagg'它將結果集中所有行的列值連接起來,以便您可以檢查狀態值序列是否已更改。 – collapsar

+0

也許你可以使用一個帶有'lag'的子查詢來用來顯示「這是哪個行發生了變化」,然後用WHERE抽取這些行。 – marmarta

回答

1

會採取一些措施來做到這一點和兩個解析函數。從內部臺階運行到外瞭解發生了什麼:

with a as( 
    select Customer, Status, Date_FROM, Date_TO, 
     case when status <> lag(status) over (partition by customer order by date_from) 
     then 1 
     else 0 
     end status_switch 
    from table), 
b as(
select 
    Customer, 
    Status, 
    Date_FROM, 
    Date_TO, 
    sum(status_switch) over (partition by customer order by status_switch) as new_status_seq 
from a 
) 
select customer, status, min(date_from), max(date_to) 
from b 
group by customer, status, new_status_seq; 

沒有測試過,可能會有一些錯誤,但你會得到的想法。

+0

這看起來很有趣,我想我明白足以解決錯誤(如果存在)。我會測試它並分享結果。謝謝 –

+0

我已經測試了您的陳述並將其適用於我的問題。這正是我所期待的。非常感謝! –