Как построить SQL для получения сгруппированных данных по дате - PullRequest
0 голосов
/ 23 октября 2018

У меня есть данные в базе данных Postgres, например:

 | id |  name  |    start_date       |      end_date       |
   1    Event1  2018-09-14 14:22:00     2018-09-15 14:22:00
   2    Event2  2018-09-15 14:22:00     2018-09-15 15:22:00

Мне нужен SQL, который возвращает мне ответ group_by date, и если длительность события (end_date, start_date) заняла 2 дня, мне нужно вернуть его дважды в массиве за два дняи это все должно быть по порядку.Таким образом, ответ должен выглядеть следующим образом.

{
  "2018-09-14": [
      {
        "id": 1,
        "name": "Event1",
        "start_date": "2018-09-14 14:22:00",
        "end_date": "2018-09-15 14:22:00",
    }],
    "2018-09-15": [{
        "id": 1,
        "name": "Event1",
        "start_date": "2018-09-14 14:22:00",
        "end_date": "2018-09-15 14:22:00",
    },
    {
        "id": 2,
        "name": "Event2",
        "start_date": "2018-09-15 14:22:00",
        "end_date": "2018-09-15 15:22:00",
    }]
 }

Не могли бы вы помочь мне с этим SQL?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Если вам нужны строки, вам нужны только эти шаги:

  1. , объединяющие обе даты в один массив с ARRAY[]
  2. unnest(), расширяет данные с каждой отдельной датой,
  3. DISTINCT удаляет все связанные элементы, где start_date == end_date.

Запрос :

SELECT DISTINCT
    unnest(ARRAY[start_date::date, end_date::date]) as dates,
    *
FROM
    events

Результат :

dates        id   name     start_date            end_date
2018-09-14   1    Event1   2018-09-14 14:22:00   2018-09-15 14:22:00
2018-09-15   1    Event1   2018-09-14 14:22:00   2018-09-15 14:22:00
2018-09-15   2    Event2   2018-09-15 14:22:00   2018-09-15 15:22:00

демо: db <> скрипка

0 голосов
/ 23 октября 2018

demo: db <> fiddle

SELECT 
    jsonb_object_agg(dates, data_array)
FROM (
    SELECT
        dates,
        jsonb_agg(data) as data_array
    FROM (
        SELECT DISTINCT
            unnest(ARRAY[start_date::date, end_date::date]) as dates,
            row_to_json(events)::jsonb as data
        FROM
            events
    )s
    GROUP BY dates
) s
  1. Преобразовать таблицу в объект json с row_to_json.
  2. , объединяя обе даты в один массив сARRAY[]
  3. unnest() расширяет данные с каждой датой.

Результат пока:

dates        data
2018-09-14   {"id": 1, "name": "Event1", "end_date": "2018-09-15 14:22:00", "start_date": "2018-09-14 14:22:00"}
2018-09-15   {"id": 1, "name": "Event1", "end_date": "2018-09-15 14:22:00", "start_date": "2018-09-14 14:22:00"}
2018-09-15   {"id": 2, "name": "Event2", "end_date": "2018-09-15 15:22:00", "start_date": "2018-09-15 14:22:00"}
2018-09-15   {"id": 2, "name": "Event2", "end_date": "2018-09-15 15:22:00", "start_date": "2018-09-15 14:22:00"}
DISTINCT удаляет все связанные элементы, где start_date == end_date. группирует по датам, объединяет элементы json в массив json (jsonb_agg) , в конце концов, группируеттаблица в элементы json (jsonb_object_agg) с key == date и value == json array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...