2016-08-23 31 views
3

我有一個列值和時間戳的表。這些值每秒都在進來。所以,我有數據如下在SQL中如何不選擇列值與其上一行中的行相同的行

V1 T1 
V1 T2 
V2 T3 
V3 T4.. 

等。所以時間戳將保持增長,但值可以是相同的,他們不會改變。 我想只選擇其中值不同於上一行的行。 所以我想減少數據並只選擇數據發生變化的記錄。 有人會知道如何做到這一點?

+0

我刪除了'mysql'標籤。使用正在使用的數據庫更正標籤。 –

+0

@vkp你是怎麼知道要刪除哪一個的? – Strawberry

+0

窗口功能,LEAD和LAG。 – DVT

回答

2

這僅適用於SQL Server 2012或更高版本

WITH cte AS (
    SELECT 
     V,T, 
     LAG(V) OVER (ORDER BY T) AS LAST_V 
    FROM 
     TABLE 
    ) 
SELECT 
    V, T 
FROM 
    cte 
WHERE 
    V <> LAST_V OR LAST_V IS NULL; 

的LAST_V爲V的前行中的值,由T.下令所以如果V <> LAST_V這意味着V是不一樣的LAST_V這是問了什麼。 LAST_V爲NULL的情況意味着您位於第一行。

+0

'WHERE'不需要'LAST_V <> 0',這意味着ORDER BY隱含的行之間的V沒有變化嗎?看起來V <> LAST_V只是包括*值*與* delta *不同的地方 - 也許我只是沒有看清楚它? –

+0

@DavidW我很困惑。我的意思是:LAST_V是前一行中V的值,按T排序。所以如果V <> LAST_V,這意味着V與LAST_V不一樣,這就是所要求的。 LAST_V爲NULL的情況意味着您位於第一行。我錯過了什麼嗎? – DVT

+0

@vkp謝謝。我剛剛(這實際上只是我上面的評論)。 – DVT

1
Declare @YourTable table (Col1 varchar(25),Col2 varchar(25)) 
Insert Into @YourTable values 
('V1','T1'), 
('V1','T2'), 
('V2','T3'), 
('V3','T4') 

;with cteBase as (
    Select *,RowNr=Row_Number() over(Partition By Col1 Order By Col2 Desc) From @YourTable 
) 
Select * from cteBase where RowNr=1 

返回

Col1 Col2 RowNr 
V1  T2  1 
V2  T3  1 
V3  T4  1 

或者你可以用與領帶條款

Select Top 1 With Ties * 
    From @YourTable 
    Order By Row_Number() over(Partition By Col1 Order By Col2 Desc) 

返回

Col1 Col2 
V1  T2 
V2  T3 
V3  T4  
+0

我不認爲分區會在這裏工作。您只需根據當前行的值檢查上一行或下一行的值。 –

+0

@vkp你很可能是正確的。我可能誤解了要求 –

相關問題