2017-09-12 1 views
0

ich eine Tabelle auf HSQLDB habe mit Daten alsSQL - Gibt eindeutige Zeilen basierend auf 2 Spalten und eine Bedingung

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 

Wie kann ich schreibe eine Abfrage, die mir Zeilen gibt, die unterschiedlichen Werte in Konto und Opendate Spalten mit dem maximalen Baldat. Wenn Baldate auch gleich ist, geben Sie die erste Zeile mit der ID zurück.

So sollte die resultset enthalten

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

ich so weit gekommen sind.

select LastName,...,State, max(BalDate) from ACCOUNTS group by Account, Opendate 

Aber die Abfrage schlägt fehl, da ich nicht eine Aggregatfunktion für die Spalten nicht in der Gruppe von (Nachnamen, Zustand etc.) verwenden kann. Wie kann ich das beheben?

Antwort

1

HSQLDB unterstützt korrelierte Unterabfragen, so denke ich, das funktioniert:

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

Aber das wird alle Zeilen zurückgeben, nicht wahr? – keanu

+0

@keanu. . . Nein. Es hätte einen Fehler zurückgegeben. Ich habe die "Grenze 1" hinzugefügt, die für die von mir beabsichtigte Logik benötigt wird. –

0

ich mit hslqdb nicht vertraut bin, so ist dies nur ANSI. Ich sehe, dass es keine analytischen Funktionen unterstützt, die das Leben leichter machen würden.

Wenn es funktioniert, ist die andere Antwort viel sauberer.

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 
Verwandte Themen