2009-04-03 4 views
2

INFO: Ich arbeite mit Microsoft SQL.
Ok der Titel ist verwirrend, aber hier ist ein Beispiel für die Tabelle mit arbeite ich:Abfrage, um 1 Instanz eines Datensatzes mit Duplikaten zurückzugeben

ID Value Signal Read Firmware Date   Time 
5  123  656  444  217  3/30/2009  11:00:00 AM 
5  123  421  333  217  3/30/2009  04:00:00 PM 
5  123  111  666  217  3/30/2009  05:00:00 PM 
9  321  231  551  216  3/30/2009  09:00:00 AM 
9  321  599  887  216  3/30/2009  09:30:00 AM 

Deshalb möchte ich die Frage zurück:

ID Value Signal Read Firmware Date   Time 
5  123  111  666  217  3/30/2009  05:00:00 PM 
9  321  599  887  216  3/30/2009  09:30:00 AM 

ich versucht habe:

SELECT DISTINCT ID, Value, Signal, Read, Firmware, Date, Time FROM .... 

Aber das gibt alle Ergebnisse zurück. Ich habe auch SELECT TOP 1 versucht ... aber ich konnte das nicht zur Arbeit bringen. Ich weiß, das ist einfach, aber ich bin verwirrt darüber, wie dies nur eine einzige eindeutige Zeile angezeigt wird.
Danke für die Hilfe.

Antwort

8

Haben Sie versucht, diese haben?

SELECT id, value, MIN(Signal), MIN(Read), MIN(Firmware), MIN(Date), MIN(Time) 
FROM 
    ... 
GROUP BY 
    ID, Value 
+0

würde ich das auch tun! – Martlark

1
SELECT 
    ID, Value, Signal, Read, Firmware, Date, Time 
FROM 
    ... 
GROUP BY 
    ID, Value 
+0

Fehler: Can not Gruppe auf Felder ausgewählt mit ‚* "Und es funktioniert nicht, wenn ich die Spalten einschließe. –

+0

Nun, das war nur ein Beispiel. Sie müssen die genauen Felder angeben. Lassen Sie mich das für Sie klären ... – Seb

0
SELECT Id, Value, Signal, Read, Firmware, Date, Time FROM table_name t1 WHERE t1.Id = (SELECT DISTINCT t2.Id FROM table_name t2) 

Unter der Annahme, dass es eine Prüfung ist, so dass Datensätze mit der gleichen Id auch denselben Wert

+0

Fehler: Höchstens ein Datensatz kann von dieser Unterabfrage zurückgegeben werden. –

0

Verwendung TOP 1 MIT TIES

+0

hast du ein beispiel dafür? Ich bekomme Fehler: Select-Anweisung enthält ein reserviertes Wort. –

+0

Ich werde eine ähnliche Abfrage für Sie als Beispiel veröffentlichen. – zvolkov

1

Die Aufzeichnungen sind verschieden, gibt es verschiedene Signal, Read und Time Werte. Wie würden Sie erwarten, dass der SQL-Server den gewünschten Server erraten würde?

Ihr Beispiel schlägt vor, dass Sie sich für den letzten Datensatz einer gegebenen Id interessieren. Wenn das wahr ist, sollte diese Abfrage für Sie arbeitet:

SELECT table.* 
FROM table 
JOIN (SELECT Id, Date, MIN(Time) FROM Table GROUP BY Id, Date) AS selector 
ON (table.Id = selector.Id AND table.Date = selector.Date and table.Time = selector.Time) 
0

ähnliche Abfrage (verwendet CROSS APPLY und korrelierte Unterabfrage w/TOP WITH TIES):

SELECT 

     a.CustodianAccountNum, 

     a.AccountName, 

     a.AccountName2, 

     a.AccountName3, 

     a.AccountStartDate, 

     a.AccountClosedDate, 

     a.TaxableFederal, 

     a.TaxableState, 

     qq.ValuationDate, 

     qq.MarketValue, 

     cg.ClientGroupGUID as ClientGUID, 

     c.ClientGUID as EntityGUID, 

     convert (bit, case when b.cnt > 1 then 1 else 0 end) as IsDuplicate 



    FROM (

     SELECT  

       a.CustodianAccountNum, 

       MIN(a.AccountID) as AccountID, 

       count(*) as cnt 

     FROM Accounts a 



     WHERE 

       a.AccountID in (SELECT AccountID from dbo.FnGetFilteredAccountIDs(@CurrentUserID)) -- apply permisssions 

       and a.DeletedDate is null 



     group by a.CustodianAccountNum 

) b 

    INNER JOIN Accounts a 

    ON 

     a.AccountID = b.AccountID 



    INNER JOIN ClientAccounts ca 

    ON 

     a.AccountID = ca.AccountID 

     and ca.DeletedDate is null 

    INNER JOIN Clients c 

    ON 

     ca.ClientID = c.ClientID 

     and c.DeletedDate is null 



    INNER JOIN ClientGroups cg 

    ON 

     c.ClientGroupID = cg.ClientGroupID 

     and cg.DeletedDate is null 

    CROSS APPLY 

    (

     SELECT 

       SUM(MarketValue) as MarketValue, 

       MIN(ValuationDate) as ValuationDate 

     FROM 

       (SELECT TOP 1 WITH TIES arv.MarketValue, arv.ValuationDate 

       FROM AccountReturnValues arv 

       where 

        arv.AccountId = a.AccountId 

        and a.AccountClosedDate is null 

       order by ValuationDate desc 

      ) q 

) qq 
Verwandte Themen