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

Откуда:
Сообщений: 106
Итак, есть таблица
login time
1 11
2 11
3 11
1 22
2 22
3 22
1 33
2 33
3 33
Условно примем первую колонку как номер счета, вторую как время создания записи

Необходимо получить
1 33
2 33
3 33
1 22
2 22
3 22

Т.е. мы получаем 2 последние записи по каждому счету.

Изначально я думал сделать вот так

select top 2 with ties
	t.* 
from 
	AccountsDaily as t
order by 
	row_number() over (partition by login order by time desc)	

но так ничего не получается, потому что записи идут не в нужном порядке.

Помогите сделать правильно.
19 авг 11, 17:38    [11148318]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
iljy
Member

Откуда:
Сообщений: 8711
truper
но так ничего не получается, потому что записи идут не в нужном порядке.

Хотите сказать, что записи получаются те? Вы смотрели, как работает top with ties? Поставьте фильтр по ROW_NUMBER <=2, а потом сортируйте как хотите.
19 авг 11, 18:27    [11148616]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
truper
Итак, есть таблица
login time
1 11
2 11
3 11
1 22
2 22
3 22
1 33
2 33
3 33
Условно примем первую колонку как номер счета, вторую как время создания записи

Необходимо получить
1 33
2 33
3 33
1 22
2 22
3 22

Т.е. мы получаем 2 последние записи по каждому счету.

Изначально я думал сделать вот так

select top 2 with ties
	t.* 
from 
	AccountsDaily as t
order by 
	row_number() over (partition by login order by [time] desc)	

но так ничего не получается, потому что записи идут не в нужном порядке.

Помогите сделать правильно.
SELECT TOP(1) WITH TIES t.* 
FROM AccountsDaily t
ORDER BY ROW_NUMBER()OVER(PARTITION BY login ORDER BY time DESC)/3
или
WITH CTE AS(SELECT ROW_NUMBER()OVER (PARTITION BY login ORDER BY [time] DESC) N,* FROM AccountsDaily)
SELECT *
FROM CTE
WHERE N<=2;
Второе, мне кажется, предпочтительнее
19 авг 11, 18:57    [11148724]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
truper
Member

Откуда:
Сообщений: 106
iap, спасибо второй вариант самый лучший

ЗЫ. Чтото я сам не допер да него. Хотя это уже подзапрос.
22 авг 11, 10:53    [11155306]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
truper
Member

Откуда:
Сообщений: 106
А как можно тоже самое получить но для MySQL?
19 янв 12, 18:46    [11935277]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
qwerty112
Guest
truper
А как можно тоже самое получить но для MySQL?

запросто !
19 янв 12, 23:42    [11936353]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо получить по две(или более) строки из каждой группы  [new]
Добрый Э - Эх
Guest
truper
А как можно тоже самое получить но для MySQL?

Да так, как в Ф.А.К.-е по MySQL написано: тынц
20 янв 12, 05:22    [11936662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить