2017-09-12 6 views
0

J'ai une table sur HSQLDB avec des données commeSQL - Retour des lignes uniques basé sur 2 colonnes et une condition

Id Account Opendate Baldate  LastName ........ State 
1 1234  040111  041217  Jackson   AZ 
2 1234  040111  051217  James    FL 
3 2345  050112  061213  Thomas   CA 
4 2345  050112  061213  Kay    DE 

Comment puis-je écrire une requête qui me donne des lignes qui ont des valeurs distinctes dans compte et colonnes Opendate , ayant le maximum de Baldate. Si Baldate est également identique, renvoyez la première ligne ordonnée par Id.

Ainsi, le resultset doit contenir

Id Account Opendate Baldate  LastName........State 
2 1234  040111  051217  James   FL 
3 2345  050112  061213  Thomas   CA 

j'ai obtenu jusqu'ici. Mais la requête échoue car je ne peux pas utiliser une fonction d'agrégation pour les colonnes qui ne sont pas groupées par (nom, état, etc). Comment puis-je résoudre ça?

Répondre

1

HSQLDB prend en charge les sous-requêtes corrélées, donc je pense que cela va fonctionner:

select a.* 
from accounts a 
where a.id = (select a2.id 
       from accounts a2 
       where a2.account = a.account and a2.opendate = a.opendate 
       order by baldate desc, id asc 
       limit 1 
      ); 
+0

Mais cela va retourner toutes les lignes, n'est-ce pas? – keanu

+0

@keanu. . . Non. Cela aurait renvoyé une erreur. J'ai ajouté la "limite 1", qui est nécessaire pour la logique que j'ai l'intention. –

0

Je ne suis pas au courant hslqdb, donc c'est juste ANSI. Je vois qu'il ne supporte pas les fonctions analytiques, ce qui rendrait la vie plus facile.

Si cela fonctionne l'autre réponse est beaucoup plus propre.

SELECT ACC_T1.Id, 
     ACC_T1.Opendate, 
     ACC_T1.Baldate 
     ACC_T1.LastName, 
     ... 
     ACC_T1.State 
    FROM Account_Table AS ACC_T1 
INNER 
    JOIN (SELECT account, 
       OpenDate, 
       MAX(BalDate) AS m_BalDate 
      FROM AccountTable 
     GROUP 
      BY account, 
       OpenDate 
     ) AS SB1 
    ON ACC_T1.Account = SB1.Account 
    AND ACC_T1.OpenDate = SB1.OpenDate 
    AND ACC_T1.BalDate = SB1.m_BalDate 
INNER 
    JOIN (SELECT account, 
       OpenDate, 
       BalDate, 
       MIN(id) AS m_id 
      FROM Account_Table 
     GROUP 
      BY account, 
       OpenDate, 
       BalDate 
     ) AS SB2 
    ON ACC_T1.Account = SB2.Account 
    AND ACC_T1.OpenDate = SB2.OpenDate 
    AND ACC_T1.BalDate = SB2.BalDate 
    AND ACC_T1.id = SB2.m_id