2013-12-16 16 views
7

Tôi muốn lấy một giá trị số nguyên trong một Chọn SQL nhưng chỉ khi thay đổi dữ liệu, ví dụ:SQL Select khi dữ liệu thay đổi

Bảng dữ liệu:

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

Bây giờ tôi muốn có được dữ liệu này:

50 52 50 30 35 30 60 65 60 

Thực thi một truy vấn riêng biệt, điều này sẽ không làm việc cho tôi bởi vì nó sẽ lấy:

50 52 30 35 60 65 

Bất kỳ ý tưởng nào?

Tôi đang làm việc với Entity Framework và C#, vì vậy đề xuất sử dụng chúng cũng sẽ được đánh giá cao!

Cảm ơn.

+0

bạn cần phải viết con trỏ cho bảng này – SanketS

+1

Nếu bạn muốn làm điều đó trong SQL bạn nên chơi xung quanh với 'ROW_NUMBER' và 'OVER' http://technet.microsoft.com /en-us/library/ms186734.aspx – Colin

Trả lời

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

lấy kết quả của bạn để dbResults sau đó làm

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

int kết quả sẽ là danh sách mà không liên tiếp bản sao

bạn có thể kiểm tra xem nó trên ideone

2

Phương pháp này cũng tương tự như nguyên tắc để @ wudzik nhưng thay vì kiểm tra danh sách kết quả của bạn mỗi lần, nó chỉ lưu trữ int cuối cùng trong một biến và kiểm tra thay vào đó.

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 để dạy tôi điều gì đó mới –

Các vấn đề liên quan