2013-01-03 113 views
1

有沒有辦法在SQL中進行以下投影?根據排序刪除第二列不更改的行嗎?SQL刪除重複的排序

FROM   TO 
1 504  1 504 
2 508  2 508 
3 504  3 504 
4 504  7 508 
5 504  8 504 
6 504  9 508 
7 508  10 504 
8 504  15 508 
9 508  16 504 
10 504   
11 504   
12 504   
13 504   
14 504   
15 508   
16 504   
17 504   
18 504   
19 504 
+2

什麼平臺? SQL Server? MySQL的?這可以使用窗口功能。 – NYCdotNet

+0

也許類似於'SELECT id,value FROM table WHERE id IN(1,2,3,7,8,9,10,15,16);'? – Oldskool

+0

我們正在使用MSSQL – pufferfish

回答

1

要使用標準SQL執行此操作,可以使用相關子查詢。這個想法是讓以前的值只保留行與當前值是不同的:

select a.* 
from (select t.* 
      (select max(id) from t t2 where t2.id < t.id) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

這真是lag()功能的實現,但沒有窗口的功能。

你也可以寫這個使用上/極限/ ROWNUM和子查詢這樣的順序:

select a.* 
from (select t.* 
      (select top 1 id from t t2 where t2.id < t.id order by id desc) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

這反過來又可以簡化爲刪除最後一個加入:

select a.* 
from (select t.* 
      (select top 1 val from t t2 where t2.id < t.id order by id desc) as pevval 
     from t 
    ) 
where a.prevval <> a.value or a.prevval is null 
2

取決於哪個RDBMS使用的是您可以使用LAG和LEAD分析函數來看看一首/下一行。

SELECT 
    a.* 
FROM (
    SELECT 
    id 
    , value 
    , LAG(value) OVER (ORDER BY id) previous_value 
    FROM some_table 
) a 
WHERE a.previous_value IS NULL OR a.value != a.previous_value 

在這裏,內聯視圖將您的數據拉出,包括具有前一行值(當按ID排序時)的列。外部查詢中的WHERE子句排除值與前一個值相同的行(並確保包含明顯具有NULL previous_value的第一行)。

+0

我收到以下消息。消息11305,級別15,狀態10,行7 並行數據倉庫(PDW)功能未啓用。 – pufferfish