使用 SUM() 和 LIMIT 对 table 中的所有行求和,忽略限制
Using SUM() with LIMIT sums all rows in the table ignoring the limit
下面两个SQLite查询return相同的结果,忽略LIMIT。有解决方法吗?
SQL
select count(*),sum(close) from history where symbol=494 limit 1;
select count(*),sum(close) from history where symbol=494;
输出
# Count(*) Sum(close)
1. 501 97836.04
2. 501 97836.04
如果您想应用 LIMIT 并在之后计数,您应该进行嵌入式查询:
select count(*),sum(close)
from
(
select close from history where symbol=494 limit 1
) t
但是这个查询几乎没有意义。
count() 和 sum() 是 aggregate 函数,它们在 GROUP 上工作 行,每个 group.If 返回单个值(行),不存在 GROUP BY 子句,则默认组为所有行。
所以在这种情况下使用 LIMIT 没有意义
例如,如果您的历史记录 table 有一个日期列,并且您根据日期进行分组,那么如果有多个组,您可能会得到多行,那么 LIMIT 可能会有意义。
考虑以下示例 SQL 和结果:-
DROP TABLE IF EXISTS history;
CREATE TABLE IF NOT EXISTS history (symbol INTEGER,close REAL, date TEXT);
INSERT INTO history VALUES
(494,2103.04,'20019-01-01'),(494,512.45,'2019-02-01'),(494,765.34,'2019-03-01'),
(494,2103.04,'20019-01-02'),(494,512.45,'2019-02-02'),(494,765.34,'2019-03-02'),
(495,2103.04,'20019-01-01'),(495,512.45,'2019-02-01'),(495,765.34,'2019-03-01')
;
/* Excluded by selects due to WHERE symbol=494 */
select count(*),sum(close) from history where symbol=494;
/* multiple counts and sums due to grouping by year and month */
select count(*),sum(close) from history where symbol=494 GROUP BY strftime('%Y%m',date);
/* IN this case LIMIT in association with ORDER returns the lowest sum of all the groups (year and month) */
select count(*),sum(close) from history as h where symbol=494 GROUP BY strftime('%Y%m',date) ORDER BY sum(close) ASC LIMIT 1;
DROP TABLE IF EXISTS history; /* cleanup test */
第一次查询
第二次查询(多组)
第三次查询(组的最小总和)
下面两个SQLite查询return相同的结果,忽略LIMIT。有解决方法吗?
SQL
select count(*),sum(close) from history where symbol=494 limit 1;
select count(*),sum(close) from history where symbol=494;
输出
# Count(*) Sum(close)
1. 501 97836.04
2. 501 97836.04
如果您想应用 LIMIT 并在之后计数,您应该进行嵌入式查询:
select count(*),sum(close)
from
(
select close from history where symbol=494 limit 1
) t
但是这个查询几乎没有意义。
count() 和 sum() 是 aggregate 函数,它们在 GROUP 上工作 行,每个 group.If 返回单个值(行),不存在 GROUP BY 子句,则默认组为所有行。
所以在这种情况下使用 LIMIT 没有意义
例如,如果您的历史记录 table 有一个日期列,并且您根据日期进行分组,那么如果有多个组,您可能会得到多行,那么 LIMIT 可能会有意义。
考虑以下示例 SQL 和结果:-
DROP TABLE IF EXISTS history;
CREATE TABLE IF NOT EXISTS history (symbol INTEGER,close REAL, date TEXT);
INSERT INTO history VALUES
(494,2103.04,'20019-01-01'),(494,512.45,'2019-02-01'),(494,765.34,'2019-03-01'),
(494,2103.04,'20019-01-02'),(494,512.45,'2019-02-02'),(494,765.34,'2019-03-02'),
(495,2103.04,'20019-01-01'),(495,512.45,'2019-02-01'),(495,765.34,'2019-03-01')
;
/* Excluded by selects due to WHERE symbol=494 */
select count(*),sum(close) from history where symbol=494;
/* multiple counts and sums due to grouping by year and month */
select count(*),sum(close) from history where symbol=494 GROUP BY strftime('%Y%m',date);
/* IN this case LIMIT in association with ORDER returns the lowest sum of all the groups (year and month) */
select count(*),sum(close) from history as h where symbol=494 GROUP BY strftime('%Y%m',date) ORDER BY sum(close) ASC LIMIT 1;
DROP TABLE IF EXISTS history; /* cleanup test */
第一次查询
第二次查询(多组)
第三次查询(组的最小总和)