2 votes

Renvoyer les lignes sélectionnées en fonction de la valeur maximale sans doublon en utilisant MS SQL

J'utilise une base de données MS SQL. J'ai besoin de sélectionner les lignes en fonction de la valeur maximale sans doublon. J'ai essayé la requête SQL ci-dessous

Select  CId, 
        Rate,
        Max(FDateTime) 
from FTable 
Where OId = 1413 and type = 'C'
Group by CId,Rate

Mais cela donne des valeurs en double.

J'ai besoin de la valeur du taux et du CID selon MAX(FDateTime) . Comment puis-je obtenir ce résultat ?

J'ai également essayé le concept de jointure d'Inner mais j'ai rencontré quelques erreurs sur ce concept.

1voto

Jibin Balachandran Points 2831

Essayez ceci

  SELECT CID ,Rate ,FDateTime 
  FROM (SELECT   CID ,Rate ,FDateTime,RANK() OVER (PARTITION BY CID  ORDER BY FDateTime DESC) rank
         FROM FTable WHERE OId = 1413 and TYPE = 'C') AS T  WHERE rank=1
 ORDER BY CID

0voto

Gordon Linoff Points 213350

Utilice row_number() :

select ft.*
from (Select ft.*,
             row_number() over (partition by cid, rate order by fdatetime desc) as seqnum
      from FTable ft
      where ft.OId = 1413 and ft.type = 'C'
     ) ft
where seqnum = 1;

0voto

Nemeros Points 386

Pour cela, vous devez utiliser une fonction de fenêtre (si votre version de Sql-Server le permet) :

WITH TMP AS (
 SELECT CId, Rate, ROW_NUMBER() OVER(PARTITION BY CId, Rate ORDER BY FDateTeim DESC) AS RNK
 FROM my_table
 WHERE .... )
SELECT CId, Rate
FROM TMP
WHERE RNK = 1

MSDN ROW_NUMBER()

0voto

gofr1 Points 13671

Vous pouvez utiliser OUTER APPLY pour obtenir MAX(FDateTime) pour certains OId y [type] :

;WITH FTable AS (
SELECT *
FROM (VALUES
(106, 6, '2016-05-12 16:15:06.340','C',1413),
(109, 6, '2016-07-28 15:33:06.247','C',1413),
(109, 6, '2016-08-09 20:37:33.643','C',1413),
(111, 6, '2016-08-08 21:23:00.487','C',1413),
(106, 7, '2016-05-18 12:50:35.210','C',1433)
) as t(CId,Rate,FDateTime,[type],OId)
)

SELECT  f.CId, 
        f.Rate,
        f.FDateTime
FROM FTable f
OUTER APPLY (
    SELECT MAX(FDateTime) fdate
    FROM FTable 
    WHERE OId = f.OID and [type] = f.[type]
    ) as t
WHERE f.OId = 1413 and f.[type] = 'C' and t.fdate=f.FDateTime

Sortie :

CId Rate    FDateTime
109 6       2016-08-09 20:37:33.643

0voto

Serg Points 7780

Tous les taux et CID pour MAX(FDateTime) parmi OId = 1413 et type = 'C'.

select  CId, 
        Rate,
        FDateTime 
from FTable f
where OId = 1413 and type = 'C'
  and FDateTime = (select Max(f2.FDateTime)
                   from FTable f2             
                   where f2.OId=f.Oid and f2.type = f.type)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X