1
votes

comment sélectionner un maximum de deux colonnes et le regrouper par station

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


0 commentaires

3 Réponses :


0
votes

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 >


0 commentaires

4
votes

Une approche possible consiste à utiliser 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.

Entrée:

station num tim
1       200 555
2       120 200
3       1   2

Instruction:

;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

Sortie:

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)


2 commentaires

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



0
votes

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>.


0 commentaires