2013-06-17 2 views
2

J'ai toujours eu des difficultés à ce sujet, mais je n'arrive pas à le faire fonctionner. été sur ces forums depuis des heures ... Ensemble de données:SQL sélectionner plusieurs lignes max où l'ID est identique

 
Row Date   AccountID Column 1  
1 21/02/2013 0:30  A0M8FA1003YP .  
2 21/02/2013 0:30  A0M8FA1003YP .  
3 21/02/2013 0:30  A0M8FA1003YP .  
4 24/09/2007 12:00 A0M8FA1003YP .  
5 24/09/2007 12:00 A0M8FA1003YP .  
6 24/09/2007 12:00 A0M8FA1003YP .  
7 12/02/2009 12:00 A023123332YP .  
8 24/09/2003 12:00 A023123332YP .  
9 24/09/2003 12:00 A023123332YP .  
10 24/09/2003 12:00 A023123332YP .   

Je veux retourner la valeur maximale de la colonne de date, mais pas seulement revenir une seule ligne, mais toutes les lignes qui correspondent à cette valeur max. C'est à dire. Dans l'ensemble ci-dessus, je veux retourner les lignes 1, 2, 3 et 7 (toutes les colonnes pour les lignes aussi bien).

 
Row Date    AccountID  Column 1  
1 21/02/2013 0:30  A0M8FA1003YP .  
2 21/02/2013 0:30  A0M8FA1003YP .  
3 21/02/2013 0:30  A0M8FA1003YP . 
7 12/02/2009 12:00 A023123332YP .  

J'ai des milliers de lignes, et le nombre de lignes correspondant à retourner pour chaque ACCOUNTID varie, environ 1, environ 2, certains 10. S'il vous plaît aidez-moi !!!

MISE À JOUR ont également essayé

Sélectionnez max (ASS_SCH_DATE) sur (partition par AccountID), AccountID, ASS_SCH_DATE, ACCOUNTID de la commande # # Temp3 par Temp3.ACCOUNTID

Résultats montrant toujours supplémentaires lignes

 

(No column name)   ASS_SCH_DATE    ACCOUNTID 
2013-02-21 00:30:00.000  2013-02-21 00:30:00.000  A0M8FA1003YP 
2013-02-21 00:30:00.000  2013-02-21 00:30:00.000  A0M8FA1003YP 
2013-02-21 00:30:00.000  2013-02-21 00:30:00.000  A0M8FA1003YP 
2013-02-21 00:30:00.000  2007-09-24 12:00:00.000  A0M8FA1003YP 
2013-02-21 00:30:00.000  2007-09-24 12:00:00.000  A0M8FA1003YP 
+0

[Qu'avez-vous essayé?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 1615903

+0

salut, j'ai tout essayé y compris des choses telles que: SELECT *, C_ENDORSEMENTID + '-' + ACCOUNTID comme 'C3' dans # Temp3 FROM # Temp2 O WH ASS_SCH_DATE IN (SELECT MAX (ASS_SCH_DATE) FROM # Groupe Temp2 par ACCOUNTID) order by ACCOUNTID – ALC

+0

Merci beaucoup équipe! Je suis resté avec Justins car il y a très peu de lignes impliquées. – ALC

Répondre

4

Requête:

SQLFIDDLEExample

SELECT t1.* 
FROM Table1 t1 
WHERE t1.Date = (SELECT MAX(t2.Date) 
       FROM Table1 t2 
       WHERE t2.AccountID = t1.AccountID) 

Resu lt:

| ROW |       DATE | ACCOUNTID | 
-------------------------------------------------------- 
| 1 | February, 21 2013 00:30:00+0000 | A0M8FA1003YP | 
| 2 | February, 21 2013 00:30:00+0000 | A0M8FA1003YP | 
| 3 | February, 21 2013 00:30:00+0000 | A0M8FA1003YP | 
| 7 | February, 12 2009 12:00:00+0000 | A023123332YP | 
+0

Merci Justin, cela fonctionne aussi bien: Script Modifié:. SELECT * t1 dE # Temp3 t1 OÙ t1.ASS_SCH_DATE = (SELECT MAX (t2.ASS_SCH_DATE) DE # Temp3 t2 OÙ t2.ACCOUNTID = t1.ACCOUNTID) commande par ACCOUNTID – ALC

1
select * from table where date in (select max(date) from table) 
+1

merci bunny, mais cela ne sélectionne que la première instance pour le premier compte de la table. Il existe des milliers de jeux d'ID de compte et de valeurs de date associées. – ALC

+1

il suffit de regarder si vous avez tous les numéros de compte liés exact exactement à la même date – Bunny

+0

Salut Bunny, désolé, ne peut pas comprendre cela. J'ai mis à jour le titre pour montrer quelques rangées de plus de la table afin que vous obteniez l'image. – ALC

0

fonctions Windows sont ce que vous recherchez:

Select row,max(date) over (partition by AccountID) As max_date, AccountID, 
Column1 from table where max_date = date; 
+0

Salut à nouveau - je vois encore des lignes qui devraient être là, j'ai mis à jour le sujet avec de nouveaux résultats – ALC

+0

Mis à jour ma réponse, essayez maintenant. – user2407394

+0

sert-il maintenant votre but? – user2407394

0

Essayez ce,

select * from tablename where date in (select max(date) from table group by AccountID) 

S'il vous plaît voir le sqlFiddle demo .Il donne même sortie que vous attendez .

+0

Salut RS, l'ai essayé, obtenant toujours les mêmes résultats (voir OP) Requête est: sélectionnez * de # Temp3 où ASS_SCH_DATE dans (sélectionnez max (ASS_SCH_DATE) de # Groupe Temp3 par AccountID). Est-ce qu'il pourrait y avoir quelque chose d'autre qui se trouve ici? – ALC

+0

J'ai ajouté un lien montrant la même sortie que vous attendez. – Rohan

0

Essayez d'utiliser Ranks:

SELECT AccountID, 
     ASS_SCH_DATE, 
     RANK() OVER (PARTITION BY ASS_SCH_DATE ORDER BY AccountID) DateRank 
FROM YourTable 
WHERE DateRank = 1 

De cette façon, vous pouvez également sélectionner plus haut rang, deuxième plus haut etc ...

+0

Merci Avi, ça marche, script modifié. AVEC RankedData AS ( \t SELECT *, \t \t \t RANK() OVER (PARTITION PAR ORDRE accountId PAR ASS_SCH_DATE desc) comme Classement \t DE # Temp3 ) SELECT RankedData.Ranking, RankedData. * DE RankedData OÙ RankedData.Ranking = 1 ORDER BY RankedData.ACCOUNTID – ALC

0

facile ...

Être 'factice' votre table, j'écrirait:

SELECT dummy.* 
FROM 
    (
     SELECT MAX(Date) Date, AccountID 
     FROM dummy 
     GROUP BY AccountID 
) max_date 
    INNER JOIN dummy 
    ON(
      dummy.Date  = max_date.Date 
     AND dummy.AccountID = max_date.AccountID 
    ) 

Ou, en utilisant la syntaxe moderne, plus sémantiquement:

WITH max_date(Date, AccountID) 
AS 
(
    SELECT MAX(Date) Date, AccountID 
    FROM dummy 
    GROUP BY AccountID 
) 
SELECT dummy.* 
FROM 
    max_date 
    INNER JOIN dummy 
    ON(
      dummy.Date  = max_date.Date 
     AND dummy.AccountID = max_date.AccountID 
    ) 
+0

J'ai créé mannequin comme: CREATE TABLE dummy ( ligne INT, Date de DATETIME, AccountID VARCHAR (255), [Colonne 1] VARCHAR (255) ) GO insert en valeurs fictives (1, '20130221 0h30', 'A0M8FA1003YP', '') insert en valeurs fictives (2, « 20130221 00 : 30 ',' A0M8FA1003YP ','. ') insérer dans les valeurs fictives (3,' 20130221 00:30 ',' A0M8FA1003YP ','. ') insérer dans les valeurs fictives (4, '20 070924 12:00 ',' A0M8FA1003YP ','. ') insérer dans des valeurs factices (5,' 20070924 12:00 ',' A0M8FA1003YP ','. ') insérer dans des valeurs factices (6,' 20070924 12:00 ',' A0M8FA1003YP ','. ') ... –

Questions connexes