Ограбление базы данных наибольшая разница запрос с sqlite - PullRequest
0 голосов
/ 30 сентября 2018

Я использую sqlite.Можно ли получить необходимую информацию из моей базы данных только одним запросом?Это работает, если я запускаю 20 запросов в цикле for (от 0 до 4000), но для запуска требуется более двух часов :( Может кто-нибудь предложить более быстрое решение, чтобы получить тот же результат?

У меня естьбаза данных (таблица ограбления), в которой хранится информация о том, когда и где произошло ограбление. Таблица ограбления имеет следующие атрибуты: дата, город, идентификатор (PK). Дата - это день, когда произошло ограбление.на данный момент у меня нет доступа к нему, но он выглядит так:

enter image description here

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

Например, из прилагаемой базы данных: город с самой большой разницей в количестве грабежей будетбыть Чикаго , потому что в июле 2017 года их было 4, а в мае 2017 года ограбление 1. Разница составляет 3 . В других городах эта разница намного ниже (1 и 0).

Я бы хотел тo получить этот результат с помощью запроса: Chicago

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

(Используя ту же схему таблицы и тестовые данные, что и в ответе Кшиштофа):

WITH total_robberies AS (SELECT city, count(robbert_date) AS robberies
                         FROM tbl_robbery
                         GROUP BY city, strftime('%Y-%m', robbert_date))
SELECT city, max(robberies) - min(robberies) AS variance
FROM total_robberies
GROUP BY city
ORDER BY variance DESC
LIMIT 1;

производит

city        variance  
----------  ----------
Chicago     2         

Одна огромная вещь: в ваших примерах данных у вас есть даты типа "1/07/2017 ", но вы заметите, что он превратил их в" 2017-07-01 ".Использование форматов ISO-8601 означает, что ваши даты могут использоваться с sqlite3 функциями даты и времени .Если оставить даты такими, какие они есть сейчас, все станет намного сложнее.Не делайте этого.

Редактировать: Кроме того, добавление индекса в столбец города таблицы очень поможет.

0 голосов
/ 30 сентября 2018

Моя тестовая таблица:

CREATE TABLE tbl_robbery (
                id INTEGER PRIMARY KEY,
                city TEXT,
                robbert_date DATE
);

Мои тестовые данные:

INSERT INTO tbl_robbery VALUES (1,'Chicago','2017-07-01');
INSERT INTO tbl_robbery VALUES (2,'Chicago','2017-08-01');
INSERT INTO tbl_robbery VALUES (3,'Chicago','2017-08-02');
INSERT INTO tbl_robbery VALUES (4,'Chicago','2017-08-03');
INSERT INTO tbl_robbery VALUES (5,'NY','2017-07-01');
INSERT INTO tbl_robbery VALUES (6,'NY','2017-08-01');

Запрос:

SELECT out.city,
   (select count(r2.id) from tbl_robbery r2 WHERE out.city=r2.city GROUP BY r2.city, strftime('%Y-%m',r2.robbert_date) ORDER BY count(r2.id) DESC) as maxcrime,
   (select count(r2.id) from tbl_robbery r2 WHERE out.city=r2.city GROUP BY r2.city,strftime('%Y-%m',r2.robbert_date) ORDER BY count(r2.id) ASC) as mincrime,
   (select count(r2.id) from tbl_robbery r2 WHERE out.city=r2.city GROUP BY r2.city,strftime('%Y-%m',r2.robbert_date) ORDER BY count(r2.id) DESC)-(select count(r2.id) from tbl_robbery r2 WHERE out.city=r2.city GROUP BY r2.city,r2.robbert_date ORDER BY count(r2.id) ASC) as crime_diff 
   FROM (select r.city FROM tbl_robbery r GROUP BY r.city) as out
   ORDER BY (maxcrime-mincrime) DESC
;

Вывод запроса:

city        maxcrime    mincrime    crime_diff
----------  ----------  ----------  ----------
Chicago     3           1           2         
NY          1           1           0      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...