Запрос возврата по месяцам в PostgreSQL - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать запрос в PostgreSQL, который должен возвращать мудрые результаты "месяц", когда даются две даты.

  SELECT count(overall_sl) as total_sales, count(CASE WHEN overall_sl < value_1 THEN 1 END) failed_sales
    FROM  (
                SELECT overall_sl, value_1
                FROM   salecombined c where c.date_updated between '2018-01-01' and '2018-12-31'
                 GROUP  BY dept_name, date_updated, date, overall_sl, no_addons,  
                value_1, category_id, subcategory_id, branch_name
     ) sales; 

Я ожидаю, что результаты будут такими (вышеуказанный запрос не делаетчто)

start_dt    end_dt       total_sales   failed_sales
--------    ------       -----------   -------------
2018-01-01  2018-01-31   0              0
2018-02-01  2018-02-28   589            154
2018-03-01  2018-03-31   107            14
2018-04-01  2018-04-30   375            114
-- and so on

Я написал запрос ниже, но его выполнение занимает больше времени;Как я могу оптимизировать это?

SELECT  date_trunc('month', dd):: date start_dt,
(date_trunc('month', dd::DATE) + interval '1 month' - interval '1 day')::date as end_dt, 

    (select count(overall_sl) from (
            SELECT overall_sl
        FROM   salecombined c                
        WHERE c.date_updated between date_trunc('month', dd):: date and (date_trunc('month', dd::DATE) + interval '1 month' - interval '1 day')::date
        GROUP  BY dept_name, date_updated, date, overall_sl, no_addons,  
        category_id, subcategory_id, branch_name
         ) jobs
     ) total_sales,

     (select count(CASE WHEN overall_sl < value_1 THEN 1 END) from (
            SELECT overall_sl, value_1
        FROM   salecombined c                
        WHERE c.date_updated between date_trunc('month', dd):: date and (date_trunc('month', dd::DATE) + interval '1 month' - interval '1 day')::date
        GROUP  BY dept_name, date_updated, date, overall_sl, no_addons,  
        value_1, category_id, subcategory_id, branch_name
         ) jobs
     ) failed_sales

FROM generate_series
    ( '2018-01-01'::timestamp 
    , '2018-12-11'::timestamp
    , '1 month'::interval) dd

Я не эксперт по SQL или PostgreSQL.

1 Ответ

0 голосов
/ 10 декабря 2018

Я не совсем уверен, но, возможно, вы ищете GROUP BY date_trunc():

демо: db <> fiddle

SELECT 
    date_trunc('month', sdate)::date as month_begin,
    (date_trunc('month', sdate) + interval '1 month -1 day')::date as month_end,
    SUM(value)
FROM sales    
WHERE sdate BETWEEN <start> and <end>
GROUP BY date_trunc('month', sdate)
  1. date_trunc('month', date) конвертирует дату в первое число месяца.Таким образом, вы можете сгруппировать все даты в течение одного месяца (поскольку все даты являются первыми месяца в этой группе)
  2. date_trunc('month', sdate) + interval '1 month -1 day' рассчитывает последний день месяца (date_trunc, чтобы перейти к первому, добавить один месяц кперейти к первому числу следующего месяца, вычесть один день, чтобы перейти к предыдущему, следующему первому = последнему дню текущего месяца.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...