[英]SQL server 2005 grouping values, display only changes
我進行了一些更新后再次發布。
我正在嘗試對一組值進行分組,但是我只想在發生更改時顯示這些值。
假設該值在1到4到3到1到1到1之間波動。
一些示例數據
value | date_loaded |
1 | 2012-03-07 |
1 | 2012-03-06 |
1 | 2012-03-05 |
3 | 2012-03-04 |
4 | 2012-03-03 |
1 | 2012-03-02 |
我想顯示每個值的波動順序,但將它們組合在一起。 因此,您只會按順序看到1、4、3、1,而不是最近的三個1。
因此,我想顯示最早的日期的最新值,例如
value | date_loaded |
1 | 2012-03-05 |
3 | 2012-03-04 |
4 | 2012-03-03 |
1 | 2012-03-02 |
最好的方法是什么? 可以做一個if語句嗎? 如果值1與值2不同,則+1表示“更改”? 因此,我將能夠按“ change1”,“ change2”等對值進行分組?
SELECT VALUE,MIN(date_loaded)
FROM YOURTABLE
GROUP BY VALUE;
該解決方案有點復雜,但可以解決問題。 不幸的是,我並沒有掌握所有代碼,但是以下是入門的概念方法:
首先,選擇一個包含row_counter的臨時表。 像這樣:
(SELECT value, date_loaded, row_number() over (partition by date_loaded) as rowNum FROM yourTable) as tempTable1
然后使用某種while循環,根據上面的臨時表(tempTable1)的行數(tempTableCount)進行迭代。 此循環將一次遍歷該臨時表一行,然后將該行插入到新的臨時表中。 每次插入后,您都將跟蹤先前插入的值並增加行計數器。 如果值更改,則執行插入操作,否則繼續循環。
我的語法可能相差很遠(很抱歉,不是在裝有sql的計算機上),但是從概念上講:
WHILE loopRowCount <= tempTableCount
BEGIN
IF(@previousValue <> (SELECT value from tempTable WHERE rowNum = loopRowCount))
BEGIN
INSERT INTO tempTable2
(value, date_loaded)
(SELECT value, date_loaded FROM tempTable WHERE rowNum = loopRowCount)
END
set @previousValue = (SELECT value FROM tempTable WHERE rowNum = loopRowCount)
loopRowCount = loopRowCount + 1
END
假設您在語法錯誤彈幕中幸存下來,您的tempTable2將包含所需的結果。 我會在早上嘗試將其清理干凈,但這是今晚我最好的選擇! 請享用! xD
怎么樣:
;WITH data AS
(
SELECT 1 as [value],'2012-03-07' as date
UNION ALL SELECT 1,'2012-03-06'
UNION ALL SELECT 1,'2012-03-05'
UNION ALL SELECT 3,'2012-03-04'
UNION ALL SELECT 4,'2012-03-03'
UNION ALL SELECT 1,'2012-03-02'
)
,data2 AS
(
SELECT
[Value]
,date
,row_number() OVER (ORDER BY (SELECT NULL)) as row1
FROM data
)
,data3 AS
(
SELECT *
, row1 - row_number() OVER (ORDER BY [Value]) as row2
from data2
)
SELECT
MIN([Value]) AS [Value]
,MIN(Date) as Date
FROM data3
GROUP BY [Value] - row2
ORDER BY MIN(row1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.