使用 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 */

第一次查询

第二次查询(多组)

第三次查询(组的最小总和)