Access 365中基于Col1的1值区间生成计数列的SQL查询需求
Access 365 实现分组连续计数的SQL方案
要生成包含Col1和辅助列Caux的结果集,其中Caux对每个以Col1=1开头的区间内的行做连续计数,你可以用以下SQL查询:
WITH RankedRows AS ( SELECT Col1, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowID FROM tblfreq ), GroupedRows AS ( SELECT Col1, RowID, (SELECT COUNT(*) FROM RankedRows AS t2 WHERE t2.RowID <= t1.RowID AND t2.Col1 = 1) AS GroupID FROM RankedRows AS t1 ) SELECT Col1, (SELECT COUNT(*) FROM GroupedRows AS t2 WHERE t2.GroupID = t1.GroupID AND t2.RowID <= t1.RowID) AS Caux FROM GroupedRows AS t1 ORDER BY RowID;
逻辑说明
- 生成行号:第一个CTE
RankedRows给每行分配唯一的RowID,确保数据顺序稳定(ORDER BY (SELECT NULL)沿用Access默认的存储顺序); - 划分分组:第二个CTE
GroupedRows计算每行的GroupID——统计从第一行到当前行中Col1=1的累计数量,这样每个1及后续到下一个1之前的行都会归为同一组; - 组内计数:最终查询在每个分组内,统计当前行在组内的位置,得到连续递增的
Caux值。
优化提示
如果你的表没有主键,建议先添加自动编号主键列,避免数据存储顺序变化导致结果不稳定:
ALTER TABLE tblfreq ADD COLUMN ID AUTOINCREMENT PRIMARY KEY;
之后把RankedRows里的ORDER BY (SELECT NULL)替换为ORDER BY ID即可。
执行查询后,将得到接受advance事理照RENsw事理 bribOptional broad的结果:
| Col1 | Caux |
|---|---|
| 0 | 1 |
| 0 | 2 |
| 1 | 1 |
| 0 | 2 |
| 0 | 3 |
| 0 | 4 |
| 0 | 5 |
| 0 | 6 |
| 1 | 1 |
| 0 | 2 |
| 0 | 3 |
| 1 | 1 |
| 0 | 2 |
内容的提问来源于stack exchange,提问作者Ins Creve
相关产品推荐
相关产品推荐

