Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
Задача следующая: есть таблица с колонками ID, Дата, Сумма. В запросе нужно вывести те записи в которых произошло изменение суммы. Пример:
№ ID Дата Сумма
1 22 2016.06.13 60
2 31 2016.06.01 60
3 33 2016.05.24 40
4 31 2016.04.11 50
5 46 2016.05.05 50

То есть в результате запроса должны увидеть записи № 2, 3, 4.
Помогите пожалуйста с запросом. Заранее спасибо!
19 июл 16, 12:43    [19426714]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
yura2004,

для разных версий сервера возможны разные решения.
19 июл 16, 12:46    [19426724]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Версия SQL Server? Если 2012+ воспользуйтесь функцией LAG
19 июл 16, 12:47    [19426731]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
Добрый Э - Эх
Guest
yura2004,

0) lead/lag
1) cross apply(top 1)
2)...
19 июл 16, 12:47    [19426732]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
iljy
Member

Откуда:
Сообщений: 8711
yura2004,

а почему вторую запись? в ней ничего не изменилось, как было 60, так и осталось.
19 июл 16, 12:48    [19426738]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
AlanDenton, SQL Server 2008
19 июл 16, 12:54    [19426765]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
iljy, изменения нужно отслеживать по дате.
19 июл 16, 12:55    [19426771]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
yura2004
iljy, изменения нужно отслеживать по дате.
То есть, вы специально в своём примере всё перемешали?
За такое надо банить.
19 июл 16, 12:57    [19426790]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
Добрый Э - Эх
Guest
yura2004
AlanDenton, SQL Server 2008
тогда вариант на кросс-аплайном топ-1 подзапросе
19 июл 16, 13:11    [19426866]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
iap
yura2004
iljy, изменения нужно отслеживать по дате.
То есть, вы специально в своём примере всё перемешали?
За такое надо банить.

Почему банить? Вы ведь знаете, что SQL Server видает результат не сортируя его. Всё перемешав, я просто сделал пример более реалистичным.
19 июл 16, 13:17    [19426898]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
Добрый Э - Эх, Вы имеете в виду что-то вроде этого:

SELECT TOP 1 Сумма
FROM table AS t1
CROSS APPLY
(SELECT * FROM table AS t2 WHERE t1.ID = t2.ID) t ?
19 июл 16, 13:28    [19426969]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
Добрый Э - Эх
Guest
yura2004,

нет, я имею ввиду что-то такое
19 июл 16, 13:39    [19427036]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
Добрый Э - Эх, спасибо, буду разбираться.
19 июл 16, 13:43    [19427076]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @tbl table(num int,id int,date date,summ int)

insert @tbl
values(1, 22, '2016.06.13', 60),
(2, 31, '2016.06.01', 60),
(3, 33, '2016.05.24', 40),
(4, 31, '2016.04.11', 50),
(5, 46, '2016.05.05', 50)

select* from @tbl order by date

select t.num
,t.id
,t.date
,t.summ
from @tbl t
join @tbl t1 on t.date < t1.date
group by t.num,t.id,t.date,t.summ
having((select summ from @tbl t2 where t2.date = t.date) != (select summ from @tbl t3 where t3.date = min(t1.date)) )
order by t.id
19 июл 16, 15:46    [19427711]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DECLARE @T TABLE(ID INT, [Дата] DATE, [Сумма] INT);
INSERT @T(ID, [Дата], [Сумма]) VALUES
 (22,'20160613',60)
,(31,'20160601',60)
,(33,'20160524',40)
,(31,'20160411',50)
,(46,'20160505',50);

WITH T AS(SELECT N=ROW_NUMBER()OVER(ORDER BY [Дата])-ROW_NUMBER()OVER(PARTITION BY [Сумма] ORDER BY [Дата]),* FROM @T)
SELECT ID=MIN(ID),[Дата]=MIN([Дата]),[Сумма]
FROM T
GROUP BY N,[Сумма]
ORDER BY MIN([Дата]);
19 июл 16, 16:01    [19427790]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух записей в таблице.  [new]
yura2004
Member

Откуда:
Сообщений: 7
всем спасибо за идеи. вопрос решен)
19 июл 16, 23:31    [19429362]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить