如何在SQL中统计指定起止点间的行数(含起点)
正确SQL语句实现方案
首先需要精准定位起点行的日期与序列值,再分范围筛选符合条件的行统计总数。假设你的表名为product_table,用户输入的起点日期为@start_date、起点SERIAL为@start_serial,当前目标日期为'10-13-23',可通过以下两种方式实现:
方法1:使用CTE定位起点行
WITH start_info AS ( SELECT DATE AS start_dt, SEQUENCE AS start_seq FROM product_table WHERE DATE = @start_date AND SERIAL = @start_serial ) SELECT COUNT(*) AS target_row_count FROM product_table pt JOIN start_info si ON 1=1 WHERE -- 起点日期内,序列大于等于起点的行(包含起点) (pt.DATE = si.start_dt AND pt.SEQUENCE >= si.start_seq) -- 起点日期与目标日期之间的所有行 OR (pt.DATE > si.start_dt AND pt.DATE < '10-13-23') -- 目标日期内的终点行(SEQUENCE=1) OR (pt.DATE = '10-13-23' AND pt.SEQUENCE = 1);
方法2:子查询嵌入条件(兼容不支持CTE的数据库)
SELECT COUNT(*) AS target_row_count FROM product_table pt WHERE (pt.DATE = @start_date AND pt.SEQUENCE >= (SELECT SEQUENCE FROM product_table WHERE DATE = @start_date AND SERIAL = @start_serial)) OR (pt.DATE > @start_date AND pt.DATE < '10-13-23') OR (pt.DATE = '10-13-23' AND pt.SEQUENCE = 1);
逻辑说明
- 第一个条件:筛选起点日期中,序列不小于起点行的所有行(确保包含起点本身)
- 第二个条件:筛选起点日期之后、目标日期之前的所有日期的全部行
- 第三个条件:仅保留目标日期中序列为1的终点行
通过这三个条件的组合,可精准统计出从起点行到终点行之间的总行数,避免错误统计日期范围内的所有行。
注意:若数据库对日期格式有严格要求,需用
TO_DATE('10-13-23', 'MM-DD-YY')这类函数将字符串转换为数据库可识别的日期类型。
内容的提问来源于stack exchange,提问作者ServalChan
相关产品推荐
相关产品推荐

