Как получить имя столбца, которое имеет максимальное значение из каждой группы в postgres? - PullRequest
0 голосов
/ 17 июня 2020

У меня стек, когда я пытаюсь вернуть максимальное значение в этом запросе. Вот мой запрос

SELECT count(app.product_service_id) AS app_service_id,
       ps.product_service_name,
       CAST(extract('month'
                    FROM to_date(app_date, 'DD/MM/YYYY')) AS INTEGER) AS months,
       CAST(extract('year'
                    FROM to_date(app_date, 'DD/MM/YYYY')) AS INTEGER) AS years,
       CONCAT(extract('year'
                      FROM to_date(app_date, 'DD/MM/YYYY')), ' ', to_char(to_date(app_date, 'DD/MM/YYYY'), 'Month')) AS month_name
FROM appointment app
JOIN product_services ps ON app.product_service_id = ps.product_service_id
WHERE to_date(app_date, 'DD/MM/YYYY') > to_date('01-07-2019', 'DD/MM/YYYY')
  AND to_date(app_date, 'DD/MM/YYYY') < to_date('01-07-2020', 'DD/MM/YYYY')
GROUP BY product_service_name,
         month_name,
         years,
         months
ORDER BY years,
         months

Он показывает мне такой результат в соответствии с запросом

enter image description here

Но я хочу максимум product_service_name. мой ожидаемый результат:

enter image description here

Я пробовал с max (ps.product_service_name), но он дал неожиданный результат. будет действительно полезно, если кто-нибудь поможет мне решить эту

1 Ответ

1 голос
/ 17 июня 2020

Вы можете использовать row_number. Если я правильно понял, вы хотите получить результат с max(app_service_id) by month.

with cte as
(
  SELECT 
    count(app.product_service_id) AS app_service_id,
    ps.product_service_name,
    CAST(extract('month' FROM to_date(app_date, 'DD/MM/YYYY')) AS INTEGER) AS months,
    CAST(extract('year' FROM to_date(app_date, 'DD/MM/YYYY')) AS INTEGER) AS years,
    CONCAT(extract('year' FROM to_date(app_date, 'DD/MM/YYYY')), ' ', to_char(to_date(app_date, 'DD/MM/YYYY'), 'Month')) AS month_name
  FROM appointment app
  JOIN product_services ps 
  ON app.product_service_id = ps.product_service_id
  WHERE to_date(app_date, 'DD/MM/YYYY') > to_date('01-07-2019', 'DD/MM/YYYY')
    AND to_date(app_date, 'DD/MM/YYYY') < to_date('01-07-2020', 'DD/MM/YYYY')
  GROUP BY 
    product_service_name,
    month_name,
    years,
    months
)

select
  app_service_id,
  product_service_name,
  months,
  years,
  month_name
from
(
  select
      *,
      row_number() over(partition by months order by app_service_id desc) as rn
  from cte
) subq
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...