Вернуть только одну строку столбца за минимальное время в Postgresql - PullRequest
0 голосов
/ 25 апреля 2018

Это довольно сложный вопрос, но я уверен, что кто-то здесь узнает ответ через 2 минуты, и я буду чувствовать себя глупо.

У меня есть таблица маршрутов,имена доставки и сроки доставки.Допустим, это выглядит так:

+------------+---------------+-------+
| ROUTE CODE |     NAME      | TIME  |
+------------+---------------+-------+
| A          | McDonald's    | 5:30  |
| A          | Arby's        | 5:45  |
| A          | Burger King   | 6:00  |
| A          | Wendy's       | 6:30  |
| B          | Arby's        | 7:45  |
| B          | Arby's        | 7:45  |
| B          | Burger King   | 8:30  |
| B          | McDonald's    | 9:00  |
| C          | Wendy's       | 9:30  |
| C          | Lion's Choice | 8:15  |
| C          | Steak N Shake | 9:50  |
| C          | Hardee's      | 10:30 |
+------------+---------------+-------+

То, что я хочу, чтобы результат возвращался, выглядит примерно так:

+------------+---------------+------+
| ROUTE CODE |     NAME      | TIME |
+------------+---------------+------+
| A          | McDonald's    | 5:30 |
| B          | Arby's        | 7:45 |
| C          | Lion's Choice | 8:15 |
+------------+---------------+------+

Итак, что я хочу, это имя минимального времени для каждогокод маршрута.

Я написал запрос, который поможет мне в этом (и не стесняйтесь улучшать этот запрос, если вы считаете, что есть более эффективный способ сделать это):

SELECT main1.route_code, main1.first_stop, main2.name
FROM
  (SELECT route_code, min(time) as first_stop FROM table1 WHERE date = yesterday GROUP BY route_code) main1 
  JOIN 
  (SELECT route_code, name, time FROM table1 WHERE date = yesterday) main2 
  ON main1.route_code = main2.route_code and main1.first_stop = main2.time

Здесь я нуждаюсь в твоей помощи.Если у меня одинаковое время, он возвращает эту строку дважды, и я хочу только один раз.Так, например, приведенный выше запрос дважды возвращает Arby's для кода маршрута «B», потому что он имеет одинаковое время.Я хочу видеть это только один раз, я никогда не хочу видеть что-либо из маршрута более одного раза.

Кто-нибудь может мне помочь?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вот еще один способ получить свой результат, который вам может понравиться или не понравиться:

SELECT route_name, time, name FROM 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY route_code ORDER BY time ASC) row_num FROM table1) subq
WHERE row_num = 1;
0 голосов
/ 25 апреля 2018

В Postgres вы можете использовать distinct on:

select distinct on (route_code) t.*
from table1 t
order by route_code, time asc;

Это, вероятно, самый быстрый метод в Postgres.Для производительности рекомендуется индекс на (route_code, time).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...