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

Есть таблица вида:
ID      Name           Total                CreateDateTime
--------------------------------------------------------------------------
1        First               5                    2011-06-23 00:00:00.000
2        Second          10                   2011-06-22 00:00:00.000
3        Third              1                    2011-06-21 00:00:00.000
4        First              50                   2011-06-22 00:00:00.000
5        Second           2                    2011-06-21 00:00:00.000
6        Third              6                    2011-06-20 00:00:00.000

Нужно получить в итоге таблицу по Name c последними датами:
ID      Name           Total                CreateDateTime
--------------------------------------------------------------------------
1        First               5                    2011-06-23 00:00:00.000
2        Second          10                   2011-06-22 00:00:00.000
3        Third              1                    2011-06-21 00:00:00.000

Спасибо!
23 июн 11, 10:14    [10859396]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
__incomer__,

если сервер > 2000: select top (1) with ties * from ... order by row_number() over(partition by ... order by ... desc)
если <= 2000, сначала выбираете максимальные даты, группируя по имени, потом джойните к таблице по имени и дате.
23 июн 11, 10:18    [10859425]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
__incomer__
Guest
SomewhereSomehow,

Server 2008 R2

SomewhereSomehow
select top (1) with ties * from ... order by row_number() over(partition by ... order by ... desc)


А что такое with ties ?
23 июн 11, 10:25    [10859464]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
__incomer__,

with ties
грубо говоря, указывает серверу "подтянуть хвосты" к результату.
А суть конструкции в том, что вы разбиваете строки на группы по имени, далее внутри каждой группы нумеруете строки по дате, и из каждой группы берете первую строку.
23 июн 11, 10:32    [10859516]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SomewhereSomehow
__incomer__,

with ties
грубо говоря, указывает серверу "подтянуть хвосты" к результату.
Хвост - tail
Так что ассоциация неточная
23 июн 11, 10:36    [10859540]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
__incomer__
Guest
SomewhereSomehow,

А можна чтобы среди хвостов выбирался один с MAX(ID), если такие вдруг будут?
23 июн 11, 10:55    [10859690]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
__incomer__
SomewhereSomehow,

А можна чтобы среди хвостов выбирался один с MAX(ID), если такие вдруг будут?
Дык, не пишите WITH TIES, если Вам один нужен!
23 июн 11, 11:11    [10859824]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
__incomer__,

добавить в order by, 2рое условие по ID DESC
23 июн 11, 11:23    [10859925]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iap
SomewhereSomehow
__incomer__,

with ties
грубо говоря, указывает серверу "подтянуть хвосты" к результату.
Хвост - tail
Так что ассоциация неточная
Это ж я образно, чтоб понятней было =) Кстати счас глянул в лингву один из переводов tie - шпала, мы кагбэ говорим серверу, дай нам результат и не забудь про шпалы!
23 июн 11, 11:47    [10860144]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
ties_ties
Guest
какие шпалы, ties во множественном это "связь".
top 1 with ties -- выбрать первый и все что туда же можно привязать, т.е. все остальные "первые", если их несколько
:)
23 июн 11, 11:56    [10860249]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
ties_ties,

это шутко юмора было, ну а один из переводов реально шпалы =)
23 июн 11, 12:17    [10860448]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
ties_ties
Guest
SomewhereSomehow,

я в курсе и шпал, и юмора, я в ответ смеюсь,
просто незеленым смехом :)
а товарищу сообщила, как это следует понимать, он же это спрашивал :)
23 июн 11, 12:46    [10860738]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
__incomer__
Guest
Не работает: select top (1) * from ... order by row_number() over(partition by ... order by ... desc) выбирает всегда только одну запись
23 июн 11, 18:08    [10864357]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
ties_ties
Guest
тоже шутка юмора????
надо 1, пишем
select top 1
.
надо ВСЕ, пишем
select top 1 WITH TIES
23 июн 11, 18:22    [10864480]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
__incomer__
Guest
Правильный ответ:
SELECT * FROM 
(
   SELECT row_number() over(partition by Name order by Total desc, id desc) AS [Rank],
   *
   FROM T
) AS Ranked
WHERE [Rank]=1
23 июн 11, 18:26    [10864505]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
__incomer__
Guest
Точнее так:
SELECT * FROM 
(
   SELECT row_number() over(partition by Name order by CreateDateTime desc, ID desc) AS [Rank],
   *
   FROM T
) AS Ranked
WHERE [Rank]=1
23 июн 11, 18:29    [10864537]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
__incomer__,

DECLARE @tmp TABLE (ID INT, NAME VARCHAR(20), Total INT, CreateDateTime DATETIME)

INSERT INTO @tmp(ID, Name, Total, CreateDateTime)
SELECT 1, 'First', 5, '2011-06-23T00:00:00.000' UNION ALL SELECT
2, 'Second', 10, '2011-06-22T00:00:00.000' UNION ALL SELECT
3, 'Third', 1, '2011-06-21T00:00:00.000' UNION ALL SELECT
4, 'First', 50, '2011-06-22T00:00:00.000' UNION ALL SELECT
5, 'Second', 2, '2011-06-21T00:00:00.000' UNION ALL SELECT
6, 'Third', 6, '2011-06-20T00:00:00.000'

SELECT  t1.*
FROM    ( SELECT    t.name ,
                    MAX(t.CreateDateTime) CreateDateTime
          FROM      @tmp t
          GROUP BY  t.name
        ) t
        JOIN @tmp t1 ON t.NAME = t1.NAME
                        AND t.CreateDateTime = t1.CreateDateTime
23 июн 11, 18:32    [10864557]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
ну или как выше писали:
SELECT TOP 1 WITH TIES *
FROM @tmp t
ORDER BY ROW_NUMBER() OVER (PARTITION BY t.NAME ORDER BY t.CreateDateTime DESC)
23 июн 11, 18:35    [10864578]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать самые новые записи?  [new]
UkLEEDS
Guest
dense_rank()?
25 июн 11, 00:07    [10873497]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить