Эффективный SQL для подсчета вхождения в последних X строках - PullRequest
1 голос
/ 21 апреля 2010

Например, у меня есть:

create table a (i int);

Предположим, есть 10 тыс. Строк.

Я хочу посчитать 0 в последних 20 строках.

Что-то вроде:

select count(*) from (select i from a limit 20) where i = 0;

Возможно ли сделать его более эффективным? Как один оператор SQL или что-то?

PS. БД - это SQLite3, если это вообще имеет значение ...

UPDATE

PPS. Нет необходимости группировать что-либо в этом случае, предположим, что таблица представляет собой буквально 1 столбец (и предположительно внутренний DB row_ID или что-то в этом роде) Мне просто любопытно, можно ли обойтись без вложенных выборок?

Ответы [ 4 ]

2 голосов
/ 21 апреля 2010

Вам нужно будет что-то упорядочить, чтобы определить последние 20 строк. Когда вы говорите последний , вы имеете в виду по дате, по идентификатору, ...?

Как-то так должно работать:

select count(*) 
from (
    select i 
    from a 
    order by j desc
    limit 20
) where i = 0; 
1 голос
/ 21 апреля 2010

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

SELECT COUNT(*) as cnt
FROM A
WHERE
    ROWID > (SELECT MAX(ROWID)-20 FROM A)
    AND i=0;

Работает только с ROWID. Как говорится в документации : строки хранятся в порядке строк.

1 голос
/ 21 апреля 2010

Боюсь, что вам нужен вложенный выбор, чтобы иметь возможность считать и ограничивать до последних X строк одновременно, потому что что-то вроде этого

SELECT count(*) FROM a GROUP BY i HAVING i = 0

будет считать 0, но во всех записях таблицы, потому что LIMIT в этом запросе в основном не будет иметь никакого эффекта.

Однако вы можете оптимизировать создание COUNT(i), так как быстрее СЧИТАТЬ только одно поле, чем 2 или более (в этом случае ваша таблица будет иметь 2поля i и rowid, которые автоматически создаются SQLite в таблицах PKless)

1 голос
/ 21 апреля 2010

Вы должны помнить, чтобы упорядочить при использовании лимита, в противном случае результат будет неопределенным. Чтобы добавить последние строки, вам нужно включить столбец с датой вставки, тогда вы можете использовать это. Без этого столбца вы не можете гарантировать, что получите последние строки.

Чтобы сделать его эффективным, вы должны убедиться, что в столбце, по которому вы заказываете, есть индекс, возможно, даже кластерный индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...