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

Откуда:
Сообщений: 28
Подскажите пожалуйста как вывести последнюю и предпоследнюю запись в таблице? можно по дате, но лучше по id наверно, вообщем любые варианты а я попробую что лучше подойдет.
Заранее благодарен!!!
16 июн 10, 14:46    [8951118]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
iljy
Member

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

top 2 .... order by .... desc
16 июн 10, 14:52    [8951173]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Taffy
Member

Откуда:
Сообщений: 20498
alexay_1985,
select top2 *
from mytable
order by id desc
16 июн 10, 14:52    [8951174]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
alexay_1985
Member

Откуда:
Сообщений: 28
Это по последней записи, а с предпоследней как быть?
17 июн 10, 10:45    [8955013]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
alexay_1985
Это по последней записи, а с предпоследней как быть?
Из двух возвращаемых записей одна - последняя, а вторая - предпоследняя.
Разве не так?
17 июн 10, 10:49    [8955044]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
alexay_1985
Это по последней записи, а с предпоследней как быть?
ТОР 2 (два)

Дима
Василий
Анна
17 июн 10, 10:49    [8955045]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
alexay_1985
Member

Откуда:
Сообщений: 28
Все проблема решена))) Спасибо всем большое)))
17 июн 10, 11:19    [8955309]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
alexay_1985
Member

Откуда:
Сообщений: 28
А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)
17 июн 10, 11:25    [8955396]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
самый очевидный способ..
select top1 * from mytable
where
id > (select min(id) from mytable)
order by id desc
17 июн 10, 11:33    [8955476]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Taffy
Member

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

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

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
17 июн 10, 11:38    [8955538]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
select top 1 * from
(
 select top 2 *
 from mytable
 order by id desc
) t
order by id;
17 июн 10, 11:43    [8955627]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Добрый Э - Эх
Guest
alexay_1985
А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)

Вложенный TOP. :):

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)
17 июн 10, 11:53    [8955755]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexay_1985
А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно)

На клиенте сначала прочитать 1ю запись полученного результата, а потом вторую
И отобразить полученные значения отдельно
17 июн 10, 11:56    [8955781]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
alexay_1985
Member

Откуда:
Сообщений: 28
Спасибо всем, очень помогли!!!
17 июн 10, 13:27    [8956727]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
r-dreamer
Member

Откуда: Казахстан, Алмата
Сообщений: 19
У меня похожая задача только надо не просто вывести две последние по дате или id записи, а сравнить их по полю сумма, т.е. делаем селект каунт с группировкой по внешнему id, а внутри группы сравнить две последних записи по сумме если она отличается то группу считаем в каунте, если она одинакова то не считаем
22 июл 10, 07:22    [9141114]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Ничего не понятно...
Guest
r-dreamer,

Пункты 4 и 6
22 июл 10, 13:31    [9143525]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Гость 123
Guest
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
23 июл 10, 11:34    [9148946]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
lod2007
Member

Откуда: Тюмень
Сообщений: 24
К теме, хотел бы поделится задачей, которая привела на эту страницу.
В таблице есть id - инкремент, state - статус ("0" - выполнен, "1" - активен).
Задача: отображать все активные, а также последние выполненые с условием, что общее число строк не больше 100.

Решение:
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 + все активные", то можно ускорить запрос:
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

Здесь, в конструкции
in (...)
выбираем id последних 100 "выполненых" записей, но id отсортирован поубыванию, поэтому в конце принудительно сортируем как надо :-)
6 окт 10, 10:02    [9560085]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
lod2007
В таблице есть id - инкремент, state - статус ("0" - выполнен, "1" - активен).
Задача: отображать все активные, а также последние выполненые с условием, что общее число строк не больше 100.

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
6 окт 10, 10:21    [9560179]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
aleks2
Guest
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
6 окт 10, 10:30    [9560252]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Последняя и предпоследняя записи в таблице  [new]
tosick4
Member

Откуда:
Сообщений: 92
Есть таблица в которой 4 поля: id, global_id, сумма, дата. Необходимо SELECT запросом получить таблицу с полями: global_id, сумма предпоследней записи, сумма последней записи (последняя и предпоследняя запись с т.з. даты) при этом что бы суммы были не равны.
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' 
    )

Предновогодняя немощь напала.
25 дек 17, 10:35    [21059581]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Добрый Э - Эх
Guest
tosick4,

и что ты хочешь увидеть на выходе ?
25 дек 17, 11:37    [21059839]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
tosick4
Member

Откуда:
Сообщений: 92
Добрый Э - Эх,

Таблицу с полями: global_d, summa_last, summa_prev
25 дек 17, 11:53    [21059896]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
Добрый Э - Эх
Guest
tosick4, давай начнем с прямолинейных зубодробильных вариантов.... глядишь, кто ещё подтянется и предложит более хитрые и менее напряжные для сервера варианты...

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
25 дек 17, 13:32    [21060207]     Ответить | Цитировать Сообщить модератору
 Re: Последняя и предпоследняя записи в таблице  [new]
tosick4
Member

Откуда:
Сообщений: 92
Добрый Э - Эх, но это видимо какой-то промежуточный результат. Нужно же 3 поля: global_id, summa_last (последнее значение суммы), summa_prev (предпоследнее значение суммы)

id	global_id	summa	date_ins
9	3000	300	2017-11-16
8	2000	200	2017-11-16
25 дек 17, 14:29    [21060503]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить