我正在使用sqlite。 仅通过一个查询就可以从数据库中获取我需要的信息吗?如果我在for循环中运行20个查询(从0到4000),它会起作用,但是运行:( 有人可以建议更快的解决方案以获得相同的结果吗?
我有一个数据库(表劫案),存储发生劫案的时间和地点。抢劫表具有以下属性:日期,城市,身份证(PK)。日期是抢劫发生的日子。 我无法附加真实的数据库,目前无法访问它,但是它看起来像这样:
我正在尝试获取以下信息: 在所有月份的抢劫案数量上差异最大的城市。
例如,来自附加数据库: 抢劫数量差异最大的城市是芝加哥,因为在2017年7月有4起,在2017年5月有1起抢劫。 差异为3 。在其他城市,这种差异要低得多(1和0)。
我想通过查询获得此结果: 芝加哥
答案 0 :(得分:1)
我的测试表:
String name = Card.ACE.name();
我的测试数据:
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
;
答案 1 :(得分:1)
(使用与Krzysztof的答案相同的表模式和测试数据):
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 date and time functions一起使用。将日期保留为现在的样子会使事情变得更复杂。不要那样做。
编辑:另外,在表格的城市列上添加索引会很有帮助。