2010-10-14 2 views
1

Моя таблица имеет 3 колонки:Справка по запросу T-SQL - выберите уникальную группировку?

RecordId 
Value 
InsertDate 

Каждый RecordId имеет несколько записей в таблице. Фактически таблица обновляется несколько раз в день.

Как написать запрос t-sql для выбора всех последних строк (на основе InsertDate) для каждой уникальной записи?

Мое умение t-sql не существует.

Заранее спасибо

+0

Так как таблица обновляется несколько раз в день, то InsertDate содержит как дату, так и время, правильно? – LittleBobbyTables

ответ

3

Вы можете использовать КТР (Common Таблицы Expression) и функцию ранжирования - что-то вроде этого:

;WITH YourQuery AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY RecordId ORDER BY InsertDate DESC) 'RowNumber' 
    FROM dbo.YourTable 
    WHERE InsertDate < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 
) 
SELECT * 
FROM YourQuery 
WHERE RowNumber = 1 

СТ (внутренние ВЫБРАТЬ) выбирает все строки, перегородки НИХ по RecordId, заказывает их InsertDate по убыванию (новейшие сначала) - так это дает вам список всех записей, упорядоченных по ID, InsertDate и RowNumber, который начинается с 1 для каждого нового RecordId.

Так что для каждого RecordId запись с RowNumber = 1 является самой последней - это то, что делает второй (внешний) SELECT.

+0

Огромное спасибо. Как изменить это, чтобы выбрать последнее, где InsertDate не соответствует сегодня? – DayTwo

+0

@DayTwo: ничего не нужно изменять - он всегда будет показывать самую последнюю дату - сегодня или вчера или неделю назад - независимо от того, что это такое, он захватывает последнее –

+0

Да, спасибо, но я не хочу, чтобы результат был содержит сегодняшнюю дату. Поэтому, если InsertDate = Today, он должен использовать следующую последнюю дату. Еще раз спасибо за вашу помощь – DayTwo

0

См. Ответ @ marc_s, но также вы должны обязательно добавить еще один столбец в таблицу, которая является уникальным идентификатором для строки. Не столько для этой проблемы, сколько для более поздних, с которыми вы столкнетесь. Даже если вы не думаете, что будете использовать его, есть много веских причин иметь первичный ключ на столе.

alter table YourTable 
add Id int identity not null 
alter table YourTable 
add constraint "YourTable_PK" primary key ("Id") 
0

Я думаю, что это возможно (и проще) без CTE и ROW_NUMBER ... или я чего-то не хватает?

select RecordID, max(InsertDate) 
from YourTable 
group by RecordID 
Смежные вопросы