2013-06-26 5 views
0

J'écris des requêtes SQL Server et j'ai besoin d'une solution pour filtrer les lignes retournées correctement.T-SQL - Filtrage des enregistrements basés sur une date

La configuration de base est la suivante - Je sélectionne un groupe d'enregistrements à partir d'une table basée principalement sur un identifiant. Ainsi, pour un identifiant donné, il peut y avoir 100 enregistrements qui sont retournés initialement. Dans ces 100 enregistrements, cependant, il y en a plusieurs qui doivent être supprimés - pas parce qu'ils sont en double, mais parce que l'un est plus récent que l'autre. J'ai donc essentiellement besoin d'un moyen de filtrer davantage les résultats en fonction de l'enregistrement/modification le plus récent. Je sais qu'idéalement, ces "anciens" enregistrements ne devraient pas être dans la base de données, mais je n'ai aucun contrôle sur cela. Ce qui se passe, c'est que les gens mettent à jour les entrées au fil du temps pour refléter les nouvelles informations, mais plutôt que d'éditer l '"ancienne" entrée, une nouvelle est saisie à chaque fois. Ainsi, il peut y avoir 3 entrées pour un identifiant donné, mais j'ai seulement besoin de celui qui a été le plus récemment entré.

Existe-t-il un moyen facile de le faire dans la chaîne de requête T-SQL? Ce serait similaire à la fonction "Last of" dans les requêtes Access. J'ai une colonne de date correctement formatée pour chaque enregistrement.

Merci!

Ma chaîne de requête à ce jour (excusez la syntaxe 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

Voulez-vous dire comme ça? http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group –

+0

Vous pouvez simplement sélectionner la valeur max de la colonne DateTime avec cet id et ensuite faire une déclaration en supprimant tout ce qui est inférieur à date avec le même identifiant. –

+0

Si vous nous montrez la requête que vous avez jusqu'à présent, cela peut aussi aider. – offthat

Répondre

0

Select est

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

Avez-vous besoin juste une sélection ou souhaitez-vous réellement supprimer les anciennes entrées?

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

C'était facile! Juste la fonction max hein? Je n'ai qu'à m'inquiéter de la sélection, la base de données va conserver les anciennes entrées. Une question de plus si cela ne vous dérange pas - j'ai environ 70 champs dans la base de données, dois-je maintenant les taper tous au lieu d'utiliser "SELECT *"? – brentf

+0

Malheureusement * ne va pas fonctionner. Mais dans SSMS juste un clic droit sur la table pour créer le select. – Paparazzi

+0

Cool. Merci beaucoup! – brentf

Questions connexes