2013-06-26 5 views
0

Я пишу запросы SQL Server и нуждаюсь в решении, как фильтровать строки, которые возвращаются должным образом.T-SQL - Фильтрация записей на основе даты

Основная настройка следующая: я выбираю группу записей из таблицы, основанной главным образом на идентификаторе. Таким образом, для данного идентификатора может быть 100 записей, которые первоначально возвращаются. Однако в этих 100 записях есть несколько из них, которые нужно удалить - не потому, что они дубликаты, а потому, что они новее, чем другие. Поэтому мне просто нужен способ дальнейшего фильтрации результатов на основе того, какая запись была создана/изменена совсем недавно.

Я знаю, что в идеале эти «старые» записи не должны быть в базе данных, но у меня нет контроля над этим. Что происходит, по сути, люди обновляют записи с течением времени, чтобы отражать новую информацию, но вместо редактирования «старой» записи каждый вводится каждый раз. Таким образом, для данного идентификатора может быть 3 записи, но мне нужен только тот, который был недавно введен.

Есть ли простой способ сделать это в строке запроса T-SQL? Он будет похож на функцию «Last of» в запросах Access. У меня есть правильно отформатированный столбец даты для каждой записи.

Спасибо!

Моя строка запроса до сих пор (простите синтаксис VB):

"SELECT *" & _ 
    "FROM Performance_Override " & _ 
    "WHERE ([Deal_Name] = " & "'" & Range("ID").value & "'" & " or" & _ 
    " [UNIQUE_ID] LIKE " & "'" & "%SPLIT_LOAN%" & "')" & " AND" & _ 
    " ([Scenario] = " & "'" & "BASE" & "')" & _ 
    "ORDER BY [Date] ASC; " 
+0

Вы имеете в виду это? http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group –

+0

Вы можете просто выбрать максимальное значение столбца DateTime с этим идентификатором, а затем сделать заявление, удаляющее что-либо меньшее, чем это дата с тем же идентификатором. –

+0

Если вы покажете нам запрос, который у вас есть до сих пор, что может помочь. – offthat

ответ

0

Select является

select ID, max(datefield) 
from table 
group by ID 

ли вам просто нужно выбрать, или вы хотите, чтобы фактически удалить старые записи?

WITH TableTop AS 
(
    SELECT ID, User, OrderDate 
    ROW_NUMBER() OVER (ID BY OrderDate DESC) AS RowNumber 
    FROM Table 
) 
SELECT ID, User, OrderDate 
FROM TableTop 
WHERE RowNumber = 1; 
+0

Это было просто! Просто максимальная функция да? Мне нужно только беспокоиться о выборе, база данных будет хранить старые записи. Еще один вопрос, если вы не возражаете - у меня есть около 70 полей в базе данных, теперь мне приходится вводить их все, а не использовать «SELECT *»? – brentf

+0

К сожалению * не будет работать. Но в SSMS просто щелкните правой кнопкой мыши по таблице, чтобы создать выбор. – Paparazzi

+0

Прохладный. Большое спасибо! – brentf