Как рассчитывать на группу с помощью array_agg в PostgreSQL - PullRequest
0 голосов
/ 17 мая 2018

Вот мой SQL: SELECT t.uid, array_agg(t.place) FROM tour_tracking t WHERE (orderon::time BETWEEN '18:00:00' AND '20:00:00') GROUP BY t.uid;

Исходный результат:
|---------------|----------------------| | uid | place | |---------------|----------------------| | a01 | {hk, hk, jp} | |---------------|----------------------| | a02 | {jp, jp, jp, jp, uk} | |---------------|----------------------|

Теперь я хочу рассчитывать на каждое место DISTINCT для каждого группового идентификатора пользователя.Обнадеживающий результат:

|---------------|--------------------------------------| | uid | place | |---------------|--------------------------------------| | a01 | something like this: {hk,2, jp,1} | |---------------|--------------------------------------| | a02 | {jp:4, uk:1} | |---------------|--------------------------------------|
Я пытаюсь объединить некоторый count() sql запрос, но не сработает .., как сделать правильный запрос?

Версия PostgreSQL: 10.3

1 Ответ

0 голосов
/ 17 мая 2018

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

SELECT
  t.uid,
  array_agg(array[t.place, t.row_count])
FROM
(
  SELECT
    uid,
    place,
    COUNT(*)   AS row_count
  FROM
    tour_tracking
  WHERE
    orderon::time BETWEEN '18:00:00' AND '20:00:00'
  GROUP BY
    uid,
    place
)
  t
GROUP BY
  t.uid
...