Как получить определенное количество записей, используя GROUP BY и ORDER BY в SQL (postgres)? - PullRequest
0 голосов
/ 31 октября 2018

Рассмотрим таблицу postgresql с N числом столбцов. Один столбец содержит биномиальную классификацию [0 1]. Я хочу сгруппировать данные по этому полю, следуя следующему синтаксису (я использую psycopg2 для python и pg для nodejs):

SELECT dummy_field,
COUNT(*)
FROM __table__
WHERE q_id = '2F5543E89823'
GROUP BY dummy_field

Этот запрос возвращает, например: [(0, 1606), (1, 6674)] значения. Я изменил приведенный выше синтаксис, чтобы включить только последние два дня на основе CURRENT_TIMESTAMP:

Это было бы:

...
AND date_field > CURRENT_TIMESTAMP - INTERVAL '2 days'
GROUP BY dummy_field

Однако я хочу получить в другом запросе только последние 1000 записей на основе ORDER BY date_field DESC LIMIT 1000. Поскольку поля выбора не включают date_field, я получаю эту ошибку:

столбец « поле .date_field» должен появляться в предложении GROUP BY или использоваться в статистической функции

Чтобы избежать этой ошибки, я использовал следующий синтаксис:

SELECT dummy_field, date_field,
COUNT(*)
FROM __table__
WHERE q_id = '2F5543E89823'
GROUP BY dummy_field, date_field
ORDER BY date_field DESC LIMIT 1000

Однако это не то, что я хочу. Я хочу использовать COUNT (*) и GROUP BY dummy_field, учитывая только последние 1000 записей, когда поле date_field отсортировано по способу DESC.

Есть ли другая альтернатива, чтобы приблизиться к этому результату? Заранее спасибо.

1 Ответ

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

Попробуй это. Как правило, вы сначала ограничиваете его, а затем GROUP / COUNT

SELECT      dummy_field, COUNT(*) AS rows
FROM        (
                SELECT      dummy_field, q_id
                FROM        __table__
                WHERE       date_field > CURRENT_TIMESTAMP - INTERVAL '2 days'
                            AND t.q_id = '2F5543E89823'
                ORDER BY    date_field DESC
                LIMIT       1000
            ) AS t
GROUP BY    dummy_field
ORDER BY    dummy_field;

Я не совсем уверен, хотите ли вы, чтобы q_id был внутри или вне критериев 1000 LIMIT. Но вы можете переместить его чуть выше GROUP BY, чтобы легко изменить поведение.

...