Получить всю строку с MIN-Value и GROUPed BY другой столбец - PullRequest
0 голосов
/ 30 января 2019

У меня есть такая таблица:

>       from    to     time   changes 
>1      A       B      40     0
>2      A       C      30     2
>3      A       D      20     1
>4      E       B      10     0

У меня есть несколько значений для 'to', например, 'B' и 'C'.Мне нужно получить всю строку за MIN (время), GROUPed BY из ...

... например:

>      from    min(time)     to  changes
>1     A       20            D   1
>2     E       10            B   0

Пробный код, например:

"SELECT min(t.time), t.changes, t.from, t.to
    FROM table t
    GROUP BY t.from"

и попытался решить проблему с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ, но, похоже, немного сложнее GROUP BY другой столбец, чем столбец, используемый для агрегирования.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Попробуйте этот запрос:

SELECT a.from,
       a.time,
       a.to,
       a.changes,
FROM (
SELECT t.from,
       t.time,
       t.to,
       t.changes,
ROW_NUMBER()over(partition by t.from, order by t.time asc) as rn
FROM table t) a
WHERE a.rn = 1

Или это:

SELECT t2.from,
       t2.time,
       t2.to,
       t2.changes,
FROM (
SELECT t.from, min(t.time) as mtime
FROM table t
GROUP BY t.from ) a
JOIN table t2
    ON t2.time = a.mtime
    AND t2.from = a.from
0 голосов
/ 30 января 2019

Агрегатные функции здесь не лучший подход, поскольку каждый столбец выполняется независимо (поэтому вы можете получить min(time), но не можете легко получить доступ к другим столбцам в строке, где существует это значение времени).

Самый простой подход заключается в использовании distinct on, например:

select distinct on(t.from) t.from, t.time, t.to, t.changes
from table t
order by t.from, t.time asc --ensures you get the row with the lowest t.time value for each value of t.from

Это даст вам одну строку для каждого значения from и соответствующие значения столбца из записи, в которой время для этого минимально.from значение

...