2013-01-15 34 views
0

我有一種屬性記錄表,其中包含客戶,屬性和日期列表。該表每月更新一次,包含所有客戶的當前屬性值。SQL - 將一系列更新日期轉換爲開始和結束日期的行

id  attr_val  date 
1  red   2012-01-01 
1  red   2012-02-01 
1  blue   2012-03-01 
2  green  2012-01-01 
2  green  2012-02-01 
2  green  2012-03-01 

我想重鑄或者使得它列出了每個屬性值的開始和結束日期轉此表。這樣我可以採取任意日期並且在date between start_dt and end_dt處獲得該日期的價值。

id  attr_val  start_dt  end_dt 
1  red   2012-01-01  2012-02-28 
1  blue   2012-03-01  NULL 
2  green  2012-01-01  NULL 

這可能與一個SQL命令,或者我需要運行某種更復雜的腳本?目標環境是Teradata的,但我認爲該解決方案是獨立於平臺...

+2

'end_dt'似乎與您的示例數據沒有關聯。 –

回答

1

這可能是你想要什麼

SELECT id, attr_val, min(date) as start_dt, max(date) as end_dt 
FROM tablename 
GROUP BY id, attr_val 

或本:

SELECT id, attr_val, min(date) as start_dt,CASE WHEN max(date) > min(date) THEN max(date) ELSE null END as end_dt 
FROM tablename 
GROUP BY id, attr_val 
+0

當屬性從一個值更改爲另一個值並返回時,min(date),max(date)解決方案將不起作用。記錄將顯示屬性日期範圍重疊...希望它是那麼容易... – user548084

+0

@ user548084 - 犯錯......那麼你如何保持「會話」不同? – Hogan

1

這樣做的一個很好的解決方案是一個相關子查詢:

select id, attr_val, min(date) as start_date, end_date 
from (select t.*, 
      (select min(date) - 1 from t t2 where t2.id = t.id and t2.date > t.date and t2.attr_val <> t.attr_val 
      ) as end_date 
     from t 
    ) t 
group by id, attr_val, end_date 

這將計算屬性爲dif的下一個日期不同於給定的id和屬性值。一個比這個日期少的是結束日期。當給定id的屬性在連續行上具有相同的值時,它們都會得到相同的end_date(即使爲NULL)。查詢然後使用此結束日期將它們組合在一起。

+0

啊,這就是'end_dt'的來源。 –

相關問題