Определение, содержит ли месяц записи - PullRequest
1 голос
/ 23 марта 2010

У меня есть список журналов с метками времени, и я бы хотел, чтобы запрос возвратил 12 логических значений, которые говорят, содержит ли определенный месяц какие-либо журналы, для каждого месяца года (начиная с января), т.е.

(True, False, False, True, False ..., True)

В настоящее время у меня есть следующий запрос, который покажет мне все месяцы, содержащие данные:

SELECT DISTINCT(EXTRACT(MONTH FROM logdate)) AS month
FROM mytable
WHERE EXTRACT(YEAR FROM logdate) = '2009'
ORDER BY month;

Вывод которого представляет собой список месяцев, содержащий данные, например ::

(1, 2, 5, 6, 12)

Я просто не могу выполнить следующий шаг - любые указатели были бы признательны.

Я использую PostgreSQL v8.4.2. Спасибо.

Ответы [ 3 ]

2 голосов
/ 23 марта 2010

Использовать generate_series ():

SELECT
    CASE
        WHEN EXTRACT(MONTH FROM logdate) IS NULL THEN false
        ELSE true
    END,
    y AS month
FROM
    mytable RIGHT JOIN generate_series(1,12) AS x(y) ON EXTRACT(month FROM logdate) = y
WHERE 
    EXTRACT(YEAR FROM logdate) = '2009';
1 голос
/ 24 марта 2010

Переместить ГДЕ в состояние СОЕДИНЕНИЯ:

SELECT DISTINCT
    CASE
        WHEN EXTRACT(MONTH FROM logdate) IS  NULL THEN false
        ELSE true
    END,
    y AS month
FROM
    mytable 
        RIGHT JOIN 
        (SELECT generate_series(1,12)) AS x(y) ON ((EXTRACT(MONTH FROM logdate)) = y AND EXTRACT(YEAR FROM logdate) = '2009')
ORDER BY 
    month ASC;

Условие года применяется только для соответствующих записей.

0 голосов
/ 23 марта 2010

Не уверен, что это самое элегантное решение, но оно должно работать (проверено на Postgres):

SELECT (CASE WHEN max(sub.jan)=1 THEN true ELSE false END) AS jan,
       (CASE WHEN max(sub.feb)=1 THEN true ELSE false END) AS feb,
       ...
FROM
(
    SELECT (CASE WHEN (EXTRACT(MONTH FROM logdate))=1 THEN 1 ELSE 0 END) AS jan,
    (CASE WHEN (EXTRACT(MONTH FROM logdate))=2 THEN 1 ELSE 0 END) AS feb,
    ...
    FROM mytable
    WHERE EXTRACT(YEAR FROM logdate) = '2009'
) as sub
...