Как получить запрос sql, отсортированный по дням недели - PullRequest
0 голосов
/ 08 января 2020

Мне нужно получить таблицу в метабазе, где строки соответствуют номеру отправки, а столбцы - день недели.

код для моего sql -

SELECT 
    to_char( date_trunc('day',delivery_date_end) , 'Dy') as week,
    (dispatch_no)::int,
    (COUNT(DISTINCT delivery_id) FILTER (WHERE (date_part('epoch',delivery_date_end)::int >= date_part('epoch',delivered_at)::int)) / COUNT(DISTINCT delivery_id)::float) * 100 AS not_late

FROM sale_b2c
WHERE 
    delivery_date_end IS NOT NULL AND 
    status = 'Delivered' AND 
    delivered_at IS NOT NULL AND 
    {{city}} AND 
    {{delivery_date}} AND
    {{hub}} AND
    dispatch_no IS NOT NULL AND
    dispatch_no !='1.0'

GROUP BY  1,2
ORDER BY 2

Вывод выглядит примерно так после поворота таблицы в метабазе

Dispatch No | Fri | Mon | Sat | Sun | Thu | Tue | Wed |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1           | a1  |  a2 | a3  | a4  | a5  | a6  | a7  |
2           | b1  |  b2 | b3  | b4  | b5  | b6  | b7  |
3           | c1  |  c2 | c3  | c4  | c5  | c6  | c7  | 
4           | d1  |  d2 | d3  | d4  | d5  | d6  | d7  | 
5           | e1  |  e2 | e3  | e4  | e5  | e6  | e7  |

Я не могу найти способ отсортировать этот вывод в правильном порядке по дням недели. Я пытался использовать

ORDER BY 2,1  

, но всегда выдает ошибку. Он также не может использовать неделю при попытке ЗАКАЗАТЬ по в некоторых сценариях ios.

Как мне отсортировать запрос в правильном формате дня недели?

1 Ответ

1 голос
/ 08 января 2020

Почему бы не повернуть данные в Postgres?

SELECT dispatch_no,
       MAX(not_late) FILTER (WHERE week = 'Mon') as mon,
       MAX(not_late) FILTER (WHERE week = 'Tue') as tue,
       MAX(not_late) FILTER (WHERE week = 'Wed') as wed,
       MAX(not_late) FILTER (WHERE week = 'Thu') as thu,
       MAX(not_late) FILTER (WHERE week = 'Fri') as fri,
       MAX(not_late) FILTER (WHERE week = 'Sat') as sat,
       MAX(not_late) FILTER (WHERE week = 'Sun') as sun
FROM (SELECT to_char( date_trunc('day',delivery_date_end) , 'Dy') as week,
             (dispatch_no)::int,
             (COUNT(DISTINCT delivery_id) FILTER (WHERE (date_part('epoch',delivery_date_end)::int >= date_part('epoch',delivered_at)::int)) / COUNT(DISTINCT delivery_id)::float) * 100 AS not_late    
      FROM sale_b2c
      WHERE delivery_date_end IS NOT NULL AND 
            status = 'Delivered' AND 
            delivered_at IS NOT NULL AND 
            {{city}} AND 
            {{delivery_date}} AND
            {{hub}} AND
            dispatch_no IS NOT NULL AND
            dispatch_no <> '1.0'
      GROUP BY 1,2
     ) w
GROUP BY 1
ORDER BY 2
...