2009-04-03 7 views
2

INFO: Je travaille avec Microsoft SQL.
Ok le titre est source de confusion, mais voici un exemple de la table, je travaille avec:Requête renvoyant 1 instance d'un enregistrement avec des doublons

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 

Je veux retourner par la requête:

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 

J'ai essayé:

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

Mais cela retourne tous les résultats. J'ai aussi essayé SELECT TOP 1 ... mais je n'ai pas réussi à le faire fonctionner. Je sais que c'est simple, mais je suis confus sur la façon d'obtenir cela pour afficher seulement 1 seule ligne unique.
Merci pour l'aide.

Répondre

8

Avez-vous essayé?

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

je le ferais aussi! – Martlark

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

Erreur: Impossible groupe sur les champs sélectionnés avec « * Et ça ne marche pas quand j'inclus les colonnes. –

+0

Eh bien, c'était juste un exemple. Vous devrez mettre les champs exacts. Permettez-moi de clarifier cela pour vous ... – 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) 

Si l'on suppose qu'il ya un chèque afin que les enregistrements avec le même ID ont également même valeur

+0

Erreur: Au plus un enregistrement peut être retourné par cette sous-requête. –

0

utilisation TOP 1 AVEC TIES

+0

avez-vous un exemple? J'obtiens l'erreur: l'instruction select inclut un mot réservé. –

+0

Je vais poster une requête similaire pour vous d'étudier comme un exemple. – zvolkov

1

Les enregistrements sont distincts, il existe différentes Signal, Read et Time valeurs. Comment voulez-vous que le serveur SQL devine lequel vous voulez?

Votre exemple suggère que vous êtes intéressé par l'enregistrement le plus récent d'un Id donné. Si cela est vrai, cette requête devrait fonctionner pour vous:

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

requête similaire (utilise CROSS APPLY et sous-requête corrélée w/TOP AVEC 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 
Questions connexes