powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Последняя и предпоследняя записи в таблице
35 сообщений из 35, показаны все 2 страниц
Последняя и предпоследняя записи в таблице
    #36690133
alexay_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста как вывести последнюю и предпоследнюю запись в таблице? можно по дате, но лучше по id наверно, вообщем любые варианты а я попробую что лучше подойдет.
Заранее благодарен!!!
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36690157
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985,

top 2 .... order by .... desc
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36690158
Фотография Taffy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985,
Код: plaintext
1.
2.
select top2 *
from mytable
order by id desc
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691726
alexay_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это по последней записи, а с предпоследней как быть?
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691737
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985Это по последней записи, а с предпоследней как быть?Из двух возвращаемых записей одна - последняя, а вторая - предпоследняя.
Разве не так?
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691738
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985Это по последней записи, а с предпоследней как быть?ТОР 2 (два)

Дима
Василий
Анна
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691804
alexay_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все проблема решена))) Спасибо всем большое)))
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691822
alexay_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691842
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самый очевидный способ..
Код: plaintext
1.
2.
3.
4.
select top1 * from mytable
where
id > (select min(id) from mytable)
order by id desc
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691857
Фотография Taffy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985,

вот скрипт (из недр форума, автора не помню к сожалению)
Постраничная выборка
В принципе, если его разберете, найдете ответ на свой вопрос :)

Код: plaintext
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.
42.
43.
44.
CREATE PROCEDURE GetSortedPage(
  @TableName VARCHAR( 50 ),
  @PrimaryKey VARCHAR( 25 ),
  @SortField VARCHAR( 100 ),
  @PageSize INT,
  @PageIndex INT =  1 ,
  @QueryFilter VARCHAR( 100 ) = NULL
) AS
SET NOCOUNT ON

DECLARE @SizeString AS VARCHAR( 5 )
DECLARE @PrevString AS VARCHAR( 5 )

SET @SizeString = CONVERT(VARCHAR, @PageSize)
SET @PrevString = CONVERT(VARCHAR, @PageSize * (@PageIndex -  1 ))

IF @QueryFilter IS NULL OR @QueryFilter = ''
BEGIN

  EXEC(
  'SELECT * FROM ' + @TableName + ' WHERE ' + @PrimaryKey + ' IN
    (SELECT TOP ' + @SizeString + ' ' + @PrimaryKey + ' FROM ' + @TableName + ' WHERE ' + @PrimaryKey + ' NOT IN
      (SELECT TOP ' + @PrevString + ' ' + @PrimaryKey + ' FROM ' + @TableName + ' ORDER BY ' + @SortField + ')
    ORDER BY ' + @SortField + ')
  ORDER BY ' + @SortField
  )
  EXEC('SELECT (COUNT(*) - 1)/' + @SizeString + ' + 1 AS PageCount FROM ' + @TableName)

END
ELSE
BEGIN

  EXEC(
  'SELECT * FROM ' + @TableName + ' WHERE ' + @PrimaryKey + ' IN
    (SELECT TOP ' + @SizeString + ' ' + @PrimaryKey + ' FROM ' + @TableName + ' WHERE ' + @QueryFilter + ' AND ' + @PrimaryKey + ' NOT IN
      (SELECT TOP ' + @PrevString + ' ' + @PrimaryKey + ' FROM ' + @TableName + ' WHERE ' + @QueryFilter + ' ORDER BY ' + @SortField + ')
    ORDER BY ' + @SortField + ')
  ORDER BY ' + @SortField
  )
  EXEC('SELECT (COUNT(*) - 1)/' + @SizeString + ' + 1 AS PageCount FROM ' + @TableName + ' WHERE ' + @QueryFilter)

END

RETURN  0 
GO
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691881
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
select top  1  * from
(
 select top  2  *
 from mytable
 order by id desc
) t
order by id;
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691906
alexay_1985А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)
Вложенный TOP. :):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with
  t (num, name) as
    (
      select  1 , 'Анна' union all
      select  2 , 'Василий' union all
      select  3 , 'Дима'
    )
select top  1  * 
  from (
         select top  2  t.*
           from t
          order by name desc
       ) v
 order by name;


num    name
---   -------
   2    Василий

( 1  row(s) affected)
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36691913
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexay_1985А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)
На клиенте сначала прочитать 1ю запись полученного результата, а потом вторую
И отобразить полученные значения отдельно
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36692171
alexay_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, очень помогли!!!
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36753612
r-dreamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня похожая задача только надо не просто вывести две последние по дате или id записи, а сравнить их по полю сумма, т.е. делаем селект каунт с группировкой по внешнему id, а внутри группы сравнить две последних записи по сумме если она отличается то группу считаем в каунте, если она одинакова то не считаем
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36754368
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36756113
Гость 123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
declare @t table (idx int, [name] varchar(max))

insert @t
      select  22 , 'Анна' union all
      select  45 , 'Василий' union all
      select  14 , 'Дима' union all
      select  50 , 'Александр' union all
      select  31 , 'Борис'

select * from @t

-- Найти просто с предпоследним idx. (Estimated Subtree Cost = 0,0098605)
select * from @t where idx = (select max(idx) from @t where idx < (select max(idx) from @t))

-- Вывести предпоследнюю и последнюю записи (Estimated Subtree Cost = 0,006572)
select * from @t where idx in ( (select max(idx) from @t where idx < (select max(idx) from @t)), (select max(idx) from @t) )


/* Тоже самое, но через сортировку */
-- (Estimated Subtree Cost = 0,0179371)
select top  1  * from @t where idx < (select max(idx) from @t) order by idx desc

-- (Estimated Subtree Cost = 0,0260138)
select top  2  * 
  from (
         select top  2  t.*
           from @t t
          order by idx desc
       ) v
 order by idx
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36884007
lod2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К теме, хотел бы поделится задачей, которая привела на эту страницу.
В таблице есть id - инкремент, state - статус ("0" - выполнен, "1" - активен).
Задача: отображать все активные, а также последние выполненые с условием, что общее число строк не больше 100.

Решение:
Код: plaintext
1.
select * from Table1 where id in (select top (select ( 100 -count(*)) from Table1  where state= 1 )  id 
from Table1   where state= 0  order by id desc) or state= 1   order by id

Если условие "выполненых 100 + все активные", то можно ускорить запрос:
Код: plaintext
1.
2.
select * from Table1 
  where id in (select top ( 100 )  id from Table1  where state= 0  order by id desc)
    or state= 1   order by id

Здесь, в конструкции
Код: plaintext
in (...)
выбираем id последних 100 "выполненых" записей, но id отсортирован поубыванию, поэтому в конце принудительно сортируем как надо :-)
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36884051
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lod2007В таблице есть id - инкремент, state - статус ("0" - выполнен, "1" - активен).
Задача: отображать все активные, а также последние выполненые с условием, что общее число строк не больше 100.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select *
from (
select *, ROW_NUMBER() over (order by state desc, id desc) as num
	from (
		select * 
		from Table1
		where state =  1 
		union all
		select *
		from (
			select top  100  *
			from Table1
			where state =  0 
			order by id desc
		) as t
	) as t
) as t
where state =  1  or num <=  100 
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #36884083
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @cnt int

select @cnt=CASE WHEN count(*)< 100  then  100  ELSE count(*) END FROM aTable WHERE state=cast(  1  as bit)

set ROWCOUNT @cnt

select * FROM aTable WHERE state=cast(  1  as bit)
union all
select * 
FROM
(select TOP  100  * FROM aTable WHERE state=cast(  0  as bit) order by id) X
order by state desc, id
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Последняя и предпоследняя записи в таблице
    #39575241
tosick4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица в которой 4 поля: id, global_id, сумма, дата. Необходимо SELECT запросом получить таблицу с полями: global_id, сумма предпоследней записи, сумма последней записи (последняя и предпоследняя запись с т.з. даты) при этом что бы суммы были не равны.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with
  t (id, global_id, summa, date_ins) as
    (
		select 1, 1000, 100, '16.09.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, 100, '16.11.2017' union all
		select 8, 2000, 200, '16.11.2017' union all
		select 9, 3000, 300, '16.11.2017' 
    )


Предновогодняя немощь напала.
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575282
tosick4,

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

Таблицу с полями: global_d, summa_last, summa_prev
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575387
tosick4, давай начнем с прямолинейных зубодробильных вариантов.... глядишь, кто ещё подтянется и предложит более хитрые и менее напряжные для сервера варианты...

Код: sql
1.
2.
3.
4.
5.
6.
7.
select top(2) t0.*
  from t t0
  LEFT join T t1
    on t0.id < t1.id
   and t0.summa = t1.summa
 where t1.id is null
 order by t0.id desC
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #39575478
tosick4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх, но это видимо какой-то промежуточный результат. Нужно же 3 поля: global_id, summa_last (последнее значение суммы), summa_prev (предпоследнее значение суммы)

Код: sql
1.
2.
3.
id	global_id	summa	date_ins
9	3000	300	2017-11-16
8	2000	200	2017-11-16
...
Рейтинг: 0 / 0
Последняя и предпоследняя записи в таблице
    #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
35 сообщений из 35, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Последняя и предпоследняя записи в таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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