2012-08-07 151 views
3

我在SQL Server數據庫中有一個表,用於存儲每天的歷史數據。其結構如下圖所示:用於顯示數據更改歷史記錄的SQL查詢

UploadDate TypeID Value1 Value2 
------------------------------------------- 
2012-01-08 1   NEG  1998-02-05 
2012-01-08 2   NEG  1999-02-09 
2012-01-08 3   STABLE 1997-02-06 
2012-02-08 1   NEG  1998-02-05 
2012-02-08 2   NEG  1999-02-09 
2012-03-08 1   POS  2012-03-08 
2012-03-08 2   STABLE 2012-01-08 

正如你可以看到上面的 2,Value1Value2已經改變了2012-03-08

我的要求是這樣的,我只要出示那些已經從先前值改變的行。

在這種情況下,因爲 2已經改變,它應該顯示當前和最接近的前一個值。而對於TypeID 3,因爲它沒有改變,它只會顯示最新的值。結果集看起來像下面這樣:

UploadDate TypeID Value1 Value2 
------------------------------------------- 
2012-01-08 3   STABLE 1997-02-06 
2012-02-08 1   NEG  1998-02-05 
2012-02-08 2   NEG  1999-02-09 
2012-03-08 1   POS  2012-03-08 
2012-03-08 2   STABLE 2012-01-08 

任何想法如何解決這個使用SQL?

+0

還不清楚你想要什麼帥哥? – codingbiz 2012-08-07 22:02:37

+0

缺少一些東西......排除前兩行的標準是什麼? – gkaran89 2012-08-07 22:10:43

+0

這個標準是這樣的,只顯示來自先前值的特定typeID的最新變化。 – 2012-08-07 22:30:53

回答

10

未啓用的版本在有序集上使用自聯接來檢查相同typeid的按時間順序排列的前一行的值。如果沒有先前的行或者值不同,則輸出該行。

; with numbered as (
    select *, 
     row_number() over (order by typeid, uploaddate) rn 
    from table1 
) 
select n1.* 
    from numbered n1 
    left join numbered n2 
    on n1.TypeID = n2.TypeID 
    and n1.rn + 1 = n2.rn 
where (n2.rn is null 
    or n1.value1 <> n2.value1 
    or n1.value2 <> n2.value2) 
order by typeid, uploaddate 

Here is Sql Fiddle with example

UPDATE:另一種不需要自連接但需要group by的變體。每個相同類型的時間軸,value1和value2都有唯一的group_number,稍後用於提取組的max(uploaddate)。

; with numbered as (
    select *, 
     row_number() over (order by typeid, uploaddate) 
     - row_number() over (partition by typeid, value1, value2 
          order by uploaddate) group_number 
    from table1 
) 
select max(uploaddate) uploaddate, typeid, value1, value2 
    from numbered 
group by typeid, value1, value2, group_number 
order by typeid, uploaddate 

Another Sql Fiddle

+0

哇......這是驚人的東西。正是我想要的。非常感謝NIkola – 2012-08-08 00:05:07

+0

@ConfusedProgrammer不客氣。明天我仍然會嘗試制定更簡單的解決方案;如果我成功了,我會讓你知道。 – 2012-08-08 00:06:25

+0

@ConfusedProgrammer好的,這裏是另一個版本。不是你需要它,但我真的想這樣做。 – 2012-08-08 00:25:44