2013-12-16 19 views
7

我想在一個SQL選擇來獲取一個整數值,但只有當數據發生變化,如:SQL選擇當數據變化

表數據:

50 50 50 52 50 30 30 35 30 30 60 65 60 60 

現在,我想得到這樣的數據:

50 52 50 30 35 30 60 65 60 

執行一個不同的查詢,這不會爲我工作,因爲它會檢索:

50 52 30 35 60 65 

任何想法?

我正在使用實體框架和C#,所以建議使用它們也將不勝感激!

謝謝。

+0

你需要寫光標此表 – SanketS

+1

如果你想這樣做在SQL你應該嘗試一下'ROW_NUMBER'和'OVER' http://technet.microsoft.com /en-us/library/ms186734.aspx – Colin

回答

3
List<int> list=...; 
var result=Enumerable.Range(0, list.Count- 1) 
        .Where(x=> x== list.Count-1 || list[x]!=list[x+1]) 
        .Select(x=>list[x]); 
3

獲取你的結果DBRESULTS然後做

var results = new List<int>(); 
foreach (var element in dbResults) 
{ 
    if(!results.Any() || results.Last() != element) 
    { 
     results.Add(element); 
    } 
} 

INT的結果將是列表,而連續的重複

您可以檢查它在ideone

2

這種方法在原理上與@ wudzik的相似,但而不是每次檢查結果列表,它只是將最後一個int存儲在一個變量中,然後進行檢查。

var result = new List<int>(); 
int? previous; 
foreach (var number in data) 
{ 
    if(!previous.HasValue || number != previous.Value){ 
    { 
     result.Add(number); 
     previous = number; 
    } 

} 
return result 
1
WITH cte as (--cte is your test data 

SELECT 
    1 id, 
    50 value UNION SELECT 
    2, 
    50 UNION SELECT 
    3, 
    50 UNION SELECT 
    4, 
    52 UNION SELECT 
    5, 
    50 UNION SELECT 
    6, 
    30 UNION SELECT 
    7, 
    30 UNION SELECT 
    8, 
    35 UNION SELECT 
    9, 
    30 UNION SELECT 
    10, 
    30 UNION SELECT 
    11, 
    60 UNION SELECT 
    12, 
    65 UNION SELECT 
    13, 
    60 UNION SELECT 
    14, 
    60 
), 
temp AS --temp numbers the rows 
(SELECT 
    id, 
    value, 
    ROW_NUMBER() OVER (ORDER BY id) rowno 
FROM cte 
    ) 
SELECT 
    t2.value 
FROM temp t1 
    INNER JOIN temp t2 
     ON t1.rowno = t2.rowno - 1 --join to the next row using rownumber 
     AND t1.value <> t2.value --but only return different values 
+0

+1教我新東西 –