Having this table:
| warehouse_id | destination_id | days |
|---|---|---|
| 1 | 1 | 2 |
| 1 | 1 | 3 |
| 2 | 1 | 3 |
| 2 | 1 | 4 |
| 3 | 1 | 5 |
| 3 | 2 | 5 |
| 1 | 2 | 2 |
| 2 | 2 | 3 |
I'd like to get the warehouse_id and days for each value of warehouse_id, where the row has the minimum value of days, and destination_id matches a specific value, ordered by days.
For example for destination_id = 1
| warehouse_id | days |
|---|---|
| 1 | 2 |
| 2 | 3 |
| 3 | 5 |
-
1the minimum value of days MIN() for destination_id = 1 WHERE for each value of warehouse_id GROUP BYAkina– Akina2021年03月01日 05:01:44 +00:00Commented Mar 1, 2021 at 5:01
-
1The best solution depends on undisclosed cardinalities. See: stackoverflow.com/a/7630564/939860, dba.stackexchange.com/a/177174/3684Erwin Brandstetter– Erwin Brandstetter2021年03月01日 17:41:52 +00:00Commented Mar 1, 2021 at 17:41
2 Answers 2
Here is the query which orders by first for warehouse_id and days then gets first record only according to DISTINCT ON clause
select distinct on (warehouse_id) warehouse_id, days from this_table where destination_id = 1 order by warehouse_id, dayswarehouse_id | days -----------: | ---: 1 | 2 2 | 3 3 | 5
db<>fiddle here
A simple aggregation like
select warehouse_id, min(days)
from this_table
where destination_id = 1
group by warehouse_id;
gives the answer in the question.
Explore related questions
See similar questions with these tags.