powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Последняя и предпоследняя записи в таблице
10 сообщений из 35, страница 2 из 2
Последняя и предпоследняя записи в таблице
    #39575479
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть подозрение, что там нужно N и N-1 для каждого global_id ->

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT
  TOP 2 WITH TIES
  [global_id], [summa], [date_ins]
FROM
  t
ORDER BY
  ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
;
WITH
t1 AS (
SELECT
  [global_id], [summa], [date_ins],
  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
FROM
  t
)
SELECT
  [global_id], [summa], [date_ins]
FROM
  t1
WHERE
  [rn] <= 2
;
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575578
tosick4,

Pivot тебе в помощь
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575603
tosick4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

Здорово! Браво! Подправив (что бы сравнивались 2 последних не по id а по дате - так правильнее) получилось одним запросом заветные 3 поля так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
with
  t (id, global_id, summa, date_ins) as
    (
		select 1, 1000, 1, '17.12.2017' union all
		select 2, 2000, 200, '16.09.2017' union all
		select 3, 3000, 300, '16.09.2017' union all
		select 4, 1000, 150, '16.10.2017' union all
		select 5, 2000, 250, '16.10.2017' union all
		select 6, 3000, 350, '16.10.2017' union all
		select 7, 1000, 1000, '16.11.2017' union all
		select 8, 2000, 2000, '16.11.2017' union all
		select 9, 3000, 3000, '16.11.2017' union all
		select 10, 1000, 1120, '16.12.2017' union all
		select 11, 2000, 1220, '16.12.2017' union all
		select 12, 3000, 1320, '16.12.2017' union all
		select 13, 4000, 1220, '16.10.2017' union all
		select 14, 4000, 10, '16.09.2017' 
    )

SELECT t_last.global_id, t_last.summa last, t_prev.summa prev FROM 
(
SELECT
  TOP 2 WITH TIES
  [global_id], [summa], [date_ins]
FROM
  t
ORDER BY
  ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [date_ins] DESC )
) t_last,
(
SELECT
  [global_id], [summa], [date_ins]
FROM
  (SELECT
  [global_id], [summa], [date_ins],
  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [date_ins] DESC )
FROM t) t1
WHERE
  [rn] = 2
) t_prev
WHERE t_last.global_id = t_prev.global_id



Код: sql
1.
2.
3.
4.
5.
global_id	last	prev
1000	1	1120
2000	1220	2000
3000	1320	3000
4000	1220	10
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575625
А как же условие tosick4 при этом что бы суммы были не равны.????
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575630
tosick4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

ой, ну конечно же )
в сааамом конце:
..........
Код: sql
1.
AND	  t_last.summa <> t_prev.summa
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575653
tosick4,

ну-ну... :)
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575656
tosick4,

а версия сервера-то какая? а то может не стоит городить огород с двойным ROW_NUMBER и просто завязаться на LEAD / LAG (доступны с версии 2012)?
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575662
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу, в 2012 появился LEAD/LAG
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
WITH
t0 ( [id], [global_id], [summa], [date_ins] ) AS (
  SELECT  1, 1000,    1, '17.12.2017' UNION ALL
  SELECT  2, 2000,  200, '16.09.2017' UNION ALL
  SELECT  3, 3000,  300, '16.09.2017' UNION ALL
  SELECT  4, 1000,  150, '16.10.2017' UNION ALL
  SELECT  5, 2000,  250, '16.10.2017' UNION ALL
  SELECT  6, 3000,  350, '16.10.2017' UNION ALL
  SELECT  7, 1000, 1000, '16.11.2017' UNION ALL
  SELECT  8, 2000, 2000, '16.11.2017' UNION ALL
  SELECT  9, 3000, 3000, '16.11.2017' UNION ALL
  SELECT 10, 1000, 1120, '16.12.2017' UNION ALL
  SELECT 11, 2000, 1220, '16.12.2017' UNION ALL
  SELECT 12, 3000, 1320, '16.12.2017' UNION ALL
  SELECT 13, 4000, 1220, '16.10.2017' UNION ALL
  SELECT 14, 4000,   10, '16.09.2017' 
),
t1 AS (
SELECT
  [global_id],
  [date_ins],
  [summa], 
  [prev_summa] = LAG( [summa], 1 ) OVER ( PARTITION BY [global_id] ORDER BY [id] DESC ),
  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
FROM
  t0
)
SELECT
  [global_id],
  [date_ins],
  [summa], 
  [prev_summa]
FROM
  t1
WHERE
      [rn] = 1
  AND [summa] != [prev_summa]
;


P.S.WITH TIES лучше не использовать - производительность у него никакущая.
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575666
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2008 / MAX - PIVOT:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
WITH
t0 ( [id], [global_id], [summa], [date_ins] ) AS (
  SELECT  1, 1000,    1, '17.12.2017' UNION ALL
  SELECT  2, 2000,  200, '16.09.2017' UNION ALL
  SELECT  3, 3000,  300, '16.09.2017' UNION ALL
  SELECT  4, 1000,  150, '16.10.2017' UNION ALL
  SELECT  5, 2000,  250, '16.10.2017' UNION ALL
  SELECT  6, 3000,  350, '16.10.2017' UNION ALL
  SELECT  7, 1000, 1000, '16.11.2017' UNION ALL
  SELECT  8, 2000, 2000, '16.11.2017' UNION ALL
  SELECT  9, 3000, 3000, '16.11.2017' UNION ALL
  SELECT 10, 1000, 1120, '16.12.2017' UNION ALL
  SELECT 11, 2000, 1220, '16.12.2017' UNION ALL
  SELECT 12, 3000, 1320, '16.12.2017' UNION ALL
  SELECT 13, 4000, 1220, '16.10.2017' UNION ALL
  SELECT 14, 4000,   10, '16.09.2017' 
),
t1 AS (
SELECT
  [global_id],
  [summa], 
  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
FROM
  t0
)
SELECT
  [global_id],
  [summa] = [1], 
  [prev_summa] = [2]
FROM
  t1
  PIVOT (
    MAX( [summa] )
    FOR [rn] IN ( [1], [2] )
  ) pvt
WHERE
  ISNULL( [1], 0 ) != ISNULL( [2], 0 )
;


2008 / МАX - GROUP:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
WITH
t0 ( [id], [global_id], [summa], [date_ins] ) AS (
  SELECT  1, 1000,    1, '17.12.2017' UNION ALL
  SELECT  2, 2000,  200, '16.09.2017' UNION ALL
  SELECT  3, 3000,  300, '16.09.2017' UNION ALL
  SELECT  4, 1000,  150, '16.10.2017' UNION ALL
  SELECT  5, 2000,  250, '16.10.2017' UNION ALL
  SELECT  6, 3000,  350, '16.10.2017' UNION ALL
  SELECT  7, 1000, 1000, '16.11.2017' UNION ALL
  SELECT  8, 2000, 2000, '16.11.2017' UNION ALL
  SELECT  9, 3000, 3000, '16.11.2017' UNION ALL
  SELECT 10, 1000, 1120, '16.12.2017' UNION ALL
  SELECT 11, 2000, 1220, '16.12.2017' UNION ALL
  SELECT 12, 3000, 1320, '16.12.2017' UNION ALL
  SELECT 13, 4000, 1220, '16.10.2017' UNION ALL
  SELECT 14, 4000,   10, '16.09.2017' 
),
t1 AS (
SELECT
  [global_id],
  [summa], 
  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
FROM
  t0
)
SELECT
  [global_id],
  [summa] = MAX( CASE WHEN [rn] = 1 THEN [summa] END ), 
  [prev_summa] = MAX( CASE WHEN [rn] = 2 THEN [summa] END )
FROM
  t1
WHERE
  [rn] < 3
GROUP BY
  [global_id]
HAVING 
  ISNULL( MAX( CASE WHEN [rn] = 1 THEN [summa] END ), 0 ) != ISNULL( MAX( CASE WHEN [rn] = 2 THEN [summa] END ), 0 )
;
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39576710
tosick4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

C LEAD\LAG что-то не получается. В итоге выбрал PIVOT (добавил в WHERE несколько строк для отсечения NULL и "пустых" для красоты). Итог:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--PIVOT
SELECT
  [global_id],
  [summa] = [1], 
  [prev_summa] = [2]
FROM
 (	  SELECT
 	  [global_id],
	  [summa], 
	  [rn] = ROW_NUMBER() OVER ( PARTITION BY [global_id] ORDER BY [id] DESC )
	  FROM  t
 ) t1
  PIVOT (
    MAX( [summa] )
    FOR [rn] IN ( [1], [2] )
  ) pvt
WHERE
  ISNULL( [1], 0 ) != ISNULL( [2], 0 )
  AND ISNULL( [1], 0 ) <>'0'
  AND ISNULL( [2], 0 ) <>'0'
  AND [1] <>''
  AND [2] <>''
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Последняя и предпоследняя записи в таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]