J'ai un tableau simple comme celui-ci
(SELECT a.station , a.num ,a.tim FROM test.dbo.tst a JOIN ( SELECT station, MAX(num) num FROM test.dbo.tst GROUP BY station ) b ON a.station = b.station and a.num=b.num ) order by station
Le résultat souhaité est comme ça
station num tim 1 200 555 2 120 200 3 1 2
j'ai écrit ce code mais pour station = 1 et num = 200 renvoient deux lignes
station num tim 1 150 10 1 200 222 1 100 5000 1 200 555 2 100 500 2 120 200 3 1 2
3 Réponses :
Mise à jour 1
La méthode recommandée est celle mentionnée par @Zhorov, mais je laisserai ma réponse pour donner toutes les solutions possibles
Réponse initiale
Essayez d'utiliser une requête similaire:
WITH CTE_1 as (SELECT station, tim, MAX(num) as maxnum GROUP BY station, tim) SELECT station, maxnum, Max(tim) FROM CTE GROUP BY station, tim
OU
SELECT T.station, T.maxnum, MAX(T.tim) as maxtim FROM (SELECT station, tim, MAX(num) as maxnum GROUP BY station, tim ) T GROUP BY station, maxnum
p >
Une approche possible consiste à utiliser Entrée: Instruction: Sortie: ROW_NUMBER ()
pour numéroter les lignes groupées par station
et classées par num
et tim code> décroissant puis sélectionnez les lignes dont le numéro est égal à 1.
station num tim
1 200 555
2 120 200
3 1 2
;WITH cte AS (
SELECT
station,
num,
tim,
ROW_NUMBER() OVER (PARTITION BY station ORDER BY num DESC, tim DESC) AS Rn
FROM #Stations
)
SELECT
station,
num,
tim
FROM cte
WHERE Rn = 1
CREATE TABLE #Stations (
station int,
num int,
tim int
)
INSERT INTO #Stations
(station, num, tim)
VALUES
(1, 150, 10),
(1, 200, 222),
(1, 100, 5000),
(1, 200, 555),
(2, 100, 500),
(2, 120, 200),
(3, 1, 2)
L'utilisation de la fonction Window est meilleure que l'utilisation de 2 clauses GROUP BY, je laisserai mentionner une autre méthode possible mais vous obtiendrez mon vote positif +1
J'ai également mis à jour ma réponse et mentionné cela pour informer le PO de ne pas accepter ma réponse s'il ne le sait pas. Bonne chance
Vous pouvez utiliser le ROW_NUMBER
fonction de partition, quelque chose du genre devrait faire l'affaire:
SELECT [Station], [Num], [Tim] FROM ( SELECT Station, Num, Tim, ROW_NUMBER() OVER(PARTITION BY Station ORDER BY Num DESC, Tim DESC) [N] FROM tst ) SQ WHERE [N] = 1
Cela fonctionne sur la base de la prise de chaque groupe de lignes, tel que groupé par la colonne Station
(c'est ce à quoi fait référence la partie PARTITION BY
de l'instruction ROW_NUMBER ()
), puis les classer d'abord par Num
puis par Tim
et en attribuant à chaque ligne du jeu de résultats un numéro de ligne. La requête externe ne prend alors que la première ligne de chaque groupe, c'est-à-dire que pour chaque valeur de Station
, elle prend celle avec la valeur la plus élevée pour Num
et Tim code>.