2013-12-16 4 views
7

Я хотел бы получить целое значение в SQL Select, но только при изменении данных, например:SQL Select, когда данные изменения

Таблица данных:

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 

Любые идеи?

Я работаю с Entity Framework и 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 для обучения чему-то новому –

Смежные вопросы