получить идентификатор на основе условия в группе по - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать SQL-запрос для объединения строк, где есть равные даты.идея состоит в том, чтобы сделать это на основе наибольшего количества часов, чтобы в итоге я получил соответствующий идентификатор для каждой даты с наибольшим количеством часов.я пытался сделать с простой группой, но, похоже, не работает, так как я не могу просто добавить статистическую функцию в столбец id, так как она должна основываться на условии часов

+------+-------+--------------------------------------+
| id   | date           | hours                       |
+------+-------+--------------------------------------+
| 1    | 2012-01-01     | 37                          |
| 2    | 2012-01-01     | 10                          |
| 3    | 2012-01-01     | 5                           |
| 4    | 2012-01-02     | 37                          |
+------+-------+--------------------------------------+

желаемый результат

+------+-------+--------------------------------------+
| id   | date           | hours                       |
+------+-------+--------------------------------------+
| 1    | 2012-01-01     | 37                          |
| 4    | 2012-01-02     | 37                          |
+------+-------+--------------------------------------+

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Если вы хотите ровно одну строку - даже если есть связи - тогда используйте row_number():

select t.*
from (select t.*, row_number() over (partition by date order by hours desc) as seqnum
      from t
     ) t
where seqnum = 1;

По иронии судьбы, и Postgres, и Oracle (оригинальные теги) имеют то, что я хотел бы рассмотретьЕсть лучшие способы сделать это, но они совершенно разные.

Postgres:

select distinct on (date) t.*
from t
order by date, hours desc;

Oracle:

select date, max(hours) as hours,
       max(id) keep (dense_rank first over order by hours desc) as id
from t
group by date;
0 голосов
/ 13 июня 2018

Вы можете использовать подзапрос с корреляцией подход:

select t.*
from table t
where id = (select t1.id
            from table t1
            where t1.date = t.date
            order by t1.hours desc
            limit 1);

В Oracle вы можете использовать fetch first 1 row only в subquery вместо LIMIT,

0 голосов
/ 13 июня 2018

Вот один подход с использованием row_number:

select id, dt, hours
from (
    select id, dt, hours, row_number() over (partition by dt order by hours desc) rn
    from yourtable
) t
where rn = 1
...