Запросите последний из нескольких прерывистых диапазонов - PullRequest
2 голосов
/ 09 апреля 2020

У меня есть postgresql таблица показаний метеостанции:

  CREATE TABLE "weather"
    (
    "id" SERIAL PRIMARY KEY,
    "dtstamp" TIMESTAMP NOT NULL UNIQUE,
    "temperature" REAL NOT NULL,
    ...
    )

Для садоводства меня интересуют даты первых и последних заморозков.

Я могу получить последний мороз весны 2019 года:

  SELECT dtstamp FROM weather WHERE temperature<0
    AND dtstamp BETWEEN '2019-01-01' AND '2019-07-01'
    ORDER BY dtstamp DESC LIMIT 1
  2019-04-13 00:55:16

и первый мороз осени 2019 года:

  SELECT dtstamp FROM weather WHERE temperature<0
    AND dtstamp BETWEEN '2019-07-01' AND '2019-12-31'
    ORDER BY dtstamp ASC LIMIT 1
  2019-10-28 03:59:20

Аналогично для других лет. Как я могу запросить это для таблицы за несколько лет?

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете извлечь месяц для фильтрации и агрегирования. Например:

SELECT EXTRACT(year FROM dtstamp),
       MAX(dtstamp) FILTER (WHERE temperature < 0)
FROM weather
WHERE temperature < 0 AND
      EXTRACT(month FROM dtstamp) < 7
GROUP BY EXTRACT(year FROM dtstamp);

и:

SELECT EXTRACT(year FROM dtstamp),
       MIN(dtstamp) FILTER (WHERE temperature < 0)
FROM weather
WHERE temperature < 0 AND
      EXTRACT(month FROM dtstamp) >= 7
GROUP BY EXTRACT(year FROM dtstamp);

Вы также можете поместить это в один запрос:

SELECT EXTRACT(year FROM dtstamp),
       MAX(dtstamp) FILTER (WHERE temperature < 0 AND EXTRACT(month FROM dtstamp) < 7) as latest_spring_frost,
       MIN(dtstamp) FILTER (WHERE temperature < 0 AND EXTRACT(month FROM dtstamp) >= 7) as earliest_autumn_frost
FROM weather
WHERE temperature < 0          
GROUP BY EXTRACT(year FROM dtstamp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...