Получить максимум две записи запроса - PullRequest
3 голосов
/ 29 сентября 2011

Запрос:

select machinename, StatusCode, size
from machine where MachineID In( '33','22') and StatusCode = 166 
ORDER BY size DESC 

Результат:

machinename  StatusCode  size
-----------  ----------  ----
test1        166         50
test1        166         25
test2        166         75
test2        166         48

Требование:

Мне нужно отображать только одну запись для каждой машины.Я должен сделать это, взяв значение максимального размера между двумя записями, как показано выше.как для test1 у меня есть два размера 50 и 25, я должен показать строку, которая имеет 50 и игнорировать строку, которая имеет 25.

Спасибо

Желаемый результат:

machinename  StatusCode  size
-----------  ----------  ----
test1        166         50
test2        166         75

Ответы [ 4 ]

4 голосов
/ 29 сентября 2011

Это будет работать, но вы не сможете сделать заказ к началу

select machinename, StatusCode, max(size) as size
from machine where MachineID In( '33','22') and StatusCode = 166 
group by machinename, StatusCode
order by max(size) DESC
3 голосов
/ 29 сентября 2011

Если вы хотите сделать заказ по StartTime, вам нужно будет использовать ROW_NUMBER, чтобы вы могли выбрать поле времени начала:

SELECT machinename, StatusCode, size
FROM (
    SELECT
        machinename,
        StatusCode,
        StartTime
        size,
        ROW_NUMBER() OVER (PARTITION BY MachineID ORDER BY size DESC) AS rn
    FROM machine
    WHERE MachineID IN ('33','22')
    AND StatusCode = 166 
) T1
WHERE rn = 1
ORDER BY StartTime DESC

Но если вы хотите заказать по размеру, это проще:

SELECT machinename, StatusCode, MAX(size) AS size
FROM machine
WHERE MachineID IN ('33','22') AND StatusCode = 166 
GROUP BY MachineID
ORDER BY MAX(size) DESC
2 голосов
/ 29 сентября 2011
select machinename, StatusCode, size
from machine a
where MachineID In( '33','22') and StatusCode = 166 
and size = (select max(size) 
from machine b
where MachineID In( '33','22') and StatusCode = 166 
and a.machinename = b.machinename)
ORDER BY StartTime DESC

HTH.

2 голосов
/ 29 сентября 2011

Используйте функцию управления окнами, чтобы генерировать идентификаторы для разделения на ваш ключ, а затем упорядочивать по возрастанию или уменьшению. Это сгенерирует 1-N для каждого раздела, где 1 будет соответствовать наибольшему значению из ORDER BY. Затем мы фильтруем для самого большого.

; WITH MACHINES AS
(
select machinename, StatusCode, size
, ROW_NUMBER() OVER (PARTITION BY machinename ORDER BY size DESC) AS RN
from machine where MachineID In( '33','22') and StatusCode = 166 

)
SELECT
select machinename, StatusCode, size
FROM MACHINES M
WHERE M.rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...