как выбрать максимум из двух столбцов и сгруппировать его по станции - PullRequest
0 голосов
/ 04 марта 2019

У меня есть простая таблица, подобная этой

 station    num     tim
   1        150    10
   1       200     222
   1       100     5000
   1       200     555
   2       100     500
   2       120     200
   3        1      2

Требуемый вывод такой:

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

Я написал этот код, но для станции = 1 и num = 200 вернуть две строки

(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 

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Один из возможных подходов - использовать ROW_NUMBER() для нумерации строк, сгруппированных по station и упорядоченных по num и tim по убыванию, а затем выбрать строки с номером, равным 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)

Оператор:

;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

Вывод:

station num tim
1       200 555
2       120 200
3       1   2
0 голосов
/ 04 марта 2019

Вы можете использовать функцию разделения ROW_NUMBER, что-то вроде этих строк должно помочь:

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

Это работает на основе взятия каждой группы строк, какгруппируется по столбцу Station (это то, к чему относится часть PARTITION BY оператора ROW_NUMBER()), затем упорядочивает их сначала по Num, а затем по Tim и присваивает каждой строке в наборе результатов строкучисло.Внешний запрос тогда берет только первую строку каждой группы, то есть для каждого значения Station он принимает тот, который имеет наибольшее значение для Num и Tim.

0 голосов
/ 04 марта 2019

Обновление 1

Рекомендуется метод, упомянутый @Zhorov, но я оставлю свой ответ, чтобы дать все возможные решения


Первоначальный ответ

Попробуйте использовать аналогичный запрос:

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

ИЛИ

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...