Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
alexay_1985 Member Откуда: Сообщений: 28 |
Подскажите пожалуйста как вывести последнюю и предпоследнюю запись в таблице? можно по дате, но лучше по id наверно, вообщем любые варианты а я попробую что лучше подойдет. Заранее благодарен!!! |
16 июн 10, 14:46 [8951118] Ответить | Цитировать Сообщить модератору |
iljy Member Откуда: Сообщений: 8711 |
alexay_1985, top 2 .... order by .... desc |
16 июн 10, 14:52 [8951173] Ответить | Цитировать Сообщить модератору |
Taffy Member Откуда: Сообщений: 20501 |
alexay_1985,select top2 * from mytable order by id desc |
16 июн 10, 14:52 [8951174] Ответить | Цитировать Сообщить модератору |
alexay_1985 Member Откуда: Сообщений: 28 |
Это по последней записи, а с предпоследней как быть? |
17 июн 10, 10:45 [8955013] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47051 |
Разве не так? ![]() |
||
17 июн 10, 10:49 [8955044] Ответить | Цитировать Сообщить модератору |
LSV Member [заблокирован] Откуда: Киев Сообщений: 30817 |
Дима Василий Анна |
||
17 июн 10, 10:49 [8955045] Ответить | Цитировать Сообщить модератору |
alexay_1985 Member Откуда: Сообщений: 28 |
Все проблема решена))) Спасибо всем большое))) |
17 июн 10, 11:19 [8955309] Ответить | Цитировать Сообщить модератору |
alexay_1985 Member Откуда: Сообщений: 28 |
А можете еще подсказать, как вывести последнюю и предпоследнюю запись отдельно? сейча выводит 2 записи последнюю и предпоследнюю вместе, а отдельно как вывести?(ну с последней понятно более менее вроде выводится, а предпоследнюю как вывести отдельно) |
17 июн 10, 11:25 [8955396] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
самый очевидный способ..select top1 * from mytable where id > (select min(id) from mytable) order by id desc |
17 июн 10, 11:33 [8955476] Ответить | Цитировать Сообщить модератору |
Taffy Member Откуда: Сообщений: 20501 |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47051 |
select top 1 * from ( select top 2 * from mytable order by id desc ) t order by id; |
17 июн 10, 11:43 [8955627] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
Вложенный 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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
На клиенте сначала прочитать 1ю запись полученного результата, а потом вторую И отобразить полученные значения отдельно |
||
17 июн 10, 11:56 [8955781] Ответить | Цитировать Сообщить модератору |
alexay_1985 Member Откуда: Сообщений: 28 |
Спасибо всем, очень помогли!!! |
17 июн 10, 13:27 [8956727] Ответить | Цитировать Сообщить модератору |
r-dreamer Member Откуда: Казахстан, Алмата Сообщений: 19 |
У меня похожая задача только надо не просто вывести две последние по дате или id записи, а сравнить их по полю сумма, т.е. делаем селект каунт с группировкой по внешнему id, а внутри группы сравнить две последних записи по сумме если она отличается то группу считаем в каунте, если она одинакова то не считаем |
22 июл 10, 07:22 [9141114] Ответить | Цитировать Сообщить модератору |
Ничего не понятно...
Guest |
r-dreamer, Пункты 4 и 6 |
22 июл 10, 13:31 [9143525] Ответить | Цитировать Сообщить модератору |
Гость 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
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] Ответить | Цитировать Сообщить модератору |
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 года. |
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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
tosick4, и что ты хочешь увидеть на выходе ? |
25 дек 17, 11:37 [21059839] Ответить | Цитировать Сообщить модератору |
tosick4 Member Откуда: Сообщений: 92 |
Добрый Э - Эх, Таблицу с полями: global_d, summa_last, summa_prev |
25 дек 17, 11:53 [21059896] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
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] Ответить | Цитировать Сообщить модератору |
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 | ![]() |