Как получить строку со столбцом max / min на основе условия из набора сгруппированных данных - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть таблица со следующей структурой и примерами данных:

id | date         | nutrient_number | nutrient_goal_value
---------------------------------------------------------
1  | "2019-01-01" | 1               | 5
2  | "2019-01-05" | 1               | 6
3  | "2019-01-06" | 1               | 7
4  | "2019-01-01" | 2               | 20
5  | "2019-01-05" | 2               | 25
6  | "2019-01-06" | 3               | 10
7  | "2019-01-10" | 3               | 8

Мне нужно получить одну строку для каждого нутриентного числа, поэтому в этом примере мне нужно будет вернуть 3 строки.Я думаю, я бы сгруппировался по нутриенту по номеру.

SELECT * from nutrient_goal_table GROUP BY nutrient_number

Но возвращаемая строка должна быть строкой с максимальной датой до или == датойЯ запрашиваю с (если он существует), и если он не существует, то это должна быть строка с минимальной датой после даты, с которой я запрашиваю.

Я мог бы заставить это работать для одного из условий, например так:

SELECT id, MAX(date), nutrient_number, nutrient_goal_value
FROM nutrient_goal_table
WHERE date <= '2019-01-06'
GROUP BY nutrient_number

Это возвращает:

id | date         | nutrient_number | nutrient_goal_value
---------------------------------------------------------
3  | "2019-01-06" | 1               | 7
5  | "2019-01-05" | 2               | 25
6  | "2019-01-06" | 3               | 10

, что хорошо.Однако, если бы мне пришлось выполнить запрос, подобный следующему:

SELECT id, MAX(date), nutrient_number, nutrient_goal_value
FROM nutrient_goal_table
WHERE date <= '2019-01-05'
GROUP BY nutrient_number

Я бы, очевидно, получил только 2 результата, когда мне нужно было бы 3.

id | date         | nutrient_number | nutrient_goal_value
---------------------------------------------------------
2  | "2019-01-05" | 1               | 6
5  | "2019-01-05" | 2               | 25

Чтобы получитьВ-третьих, мне понадобится вышеуказанный запрос для выборки ближайшей даты после указанной мной даты, т.е. минимальной даты, превышающей указанную дату, но это следует делать только в том случае, если не существует строк, в которых есть дата <= предоставленная дата. </p>

Набор результатов, который мне нужен, будет выглядеть следующим образом с указанием даты '2019-01-05'

id | date         | nutrient_number | nutrient_goal_value
---------------------------------------------------------
2  | "2019-01-05" | 1               | 6
5  | "2019-01-05" | 2               | 25
6  | "2019-01-06" | 3               | 10

Я уже некоторое время ломаю голову, ноЯ не очень опытный, и я изо всех сил пытаюсь найти решение.Кто-нибудь может указать мне правильное направление?

1 Ответ

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

Чтобы получить max(date) или min(date), вы можете использовать coalesce(), включенное в ограничение соединения:

select n.* 
from (SELECT distinct nutrient_number from nutrient_goal_table) d
inner join nutrient_goal_table n
on 
  n.nutrient_number = d.nutrient_number
  and 
  n.date = coalesce( 
    (select max(date) from nutrient_goal_table where date <= '2019-01-05' and nutrient_number = d.nutrient_number),
    (select min(date) from nutrient_goal_table where date >= '2019-01-05' and nutrient_number = d.nutrient_number)
  )

См. Демоверсию .

...