SQL: сгруппировать, упорядочить по времени и показать время в правильном формате - PullRequest
0 голосов
/ 19 октября 2018

Я новичок в SQL, и мне нужно упорядочить и сгруппировать по времени.В то же время мне нужно показать в правильном формате времени.

select test, total 
  from (
        select to_char(last_create_date, 'YYYYmm') as "test", count (seq) as "total"
          from public.newsfeed 
         group by to_char(last_create_date, 'YYYYmm')
         order by to_char(last_create_date, 'YYYYmm')) as T1

enter image description here

Но всякий раз, когда я хочу получить вывод в формате "MON YYYY", я получаю следующую ошибку.Как я могу превзойти?Я уже прочитал довольно похожие проблемы в stackoverflow, и они предлагают использовать подзапрос или конвертировать.Но я не знаю, как применить это в моем случае.

 ERROR:  column "newsfeed.last_create_date" must appear in the GROUP BY
 clause or be used in an aggregate function LINE 1: select test, total
 from (select to_char(last_create_date, 'M...
                                                 ^
 ********** Error **********

 ERROR: column "newsfeed.last_create_date" must appear in the GROUP BY
 clause or be used in an aggregate function SQL state: 42803 Character:
 41

Ответы [ 4 ]

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

Postgres позволяет использовать псевдонимы столбцов в select.Таким образом, вы можете записать это как:

select to_char(last_create_date, 'YYYYmm') as test,
       count(seq) as total
from public.newsfeed 
group by test
order by min(last_create_date);

Обратите внимание, что упорядочение по минимуму last_create_date приводит результаты в хронологическом порядке, а не в алфавитном порядке по test.

Это позволяет легко изменить формат:

select to_char(last_create_date, 'Mon YYYY') as test,
       count(seq) as total
from public.newsfeed 
group by test
order by min(last_create_date);
0 голосов
/ 19 октября 2018

попробуйте, как показано ниже, без необходимости подзапрос

    select to_char(last_create_date, 'MON YYYY') as "test",
    count(seq) as "total"
    FROM public.newsfeed 
    group by to_char(last_create_date, 'MON YYYY')
    order by to_char(last_create_date, 'MON YYYY')
0 голосов
/ 19 октября 2018

Как указывает сообщение об ошибке, вам нужно включить неагрегированный столбец в список GROUP BY, как показано в списке SELECT:

select t1.test, t1.total 
  from   
  (select to_char(last_create_date, 'MON YYYY') as test, count (seq) as "total"
     from public.newsfeed 
    group by to_char(last_create_date, 'MON YYYY')
    order by test 
  ) as t1;

Но вам не нужно реформировать свой ORDER BY в точном формате to_char(last_create_date, 'MON YYYY'), где вместо этого можно использовать сокращенно псевдоним (test).

Кстати, вы можете заменить count (seq) с count(0), count(1), count(*) или даже count(test) .. и т. д.все они дают одинаковые результаты для подсчета, если вы не применяете отличительные, такие как count(distinct test)

Rextester Demo

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

Попробуйте ниже с 'Mon YYYY' формат

select to_char(last_create_date, 'Mon YYYY') as "test", count (seq) as total
FROM public.newsfeed 
group by to_char(last_create_date, 'Mon YYYY')
order by to_char(last_create_date, 'Mon YYYY')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...