我想创建一个SQlite查询来查找特定日期的条纹.

我有一张桌子:

id dt
1 10/12/2023
2 11/12/2023
3 12/12/2023
4 16/12/2023
5 17/12/2023
6 25/12/2023
7 26/12/2023

例如,如果我查询以下数据:

  • 09/12/2023-结果将是0
  • 12/12/2023-结果将是3
  • 11/12/2023-结果将是2
  • 17/12/2023 -结果将是2
  • 24/12/2023-结果将是0
  • 26/12/2023 -结果将是2

推荐答案

你有一个gaps and islands分的问题.为了解决这个问题,我们需要通过唯一的id来枚举每一组连续的行.

我们可以使用窗口函数LAG()来获取前一行并计算连续日期之间的差值,然后对所产生的差值应用连续总和:

WITH cte AS (
  SELECT *,
         CASE WHEN julianday(dt)-julianday(LAG(dt, 1, dt) OVER (ORDER BY dt)) <= 1 THEN 0 ELSE 1 END AS date_diff
  FROM mytable
  WHERE dt <= '2023-12-26'
),
cte2 AS (
  SELECT *, SUM(date_diff) OVER (ORDER BY dt) as grp
  FROM cte
)
SELECT COUNT(*)
FROM cte2 c
INNER JOIN (
  SELECT MAX(grp) as latest_grp, MAX(dt) as latest_dt
  FROM cte2
) AS s ON s.latest_grp = c.grp AND s.latest_dt = '2023-12-26'

Demo here

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

当有空单元格时,如何连接列

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

SQL查询:合并2个表

收到%1、%2或%2邮箱的唯一客户

使用Kotlin Exposed SQL DSL Select 多个值并排序

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

仅当交叉应用返回单值时才更新记录

在Netezza SQL中将字符DataType转换为整型DataType

如何为缺少的类别添加行

此过程如何在不引用传递的参数值的情况下执行工作?

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

每次计数器增加时通过运行总重置进行分组

SQL Server - 判断 ids 层次 struct 中的整数 (id)

删除重复记录但保留最新的SQL查询

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

条件前置值

连续日期的SQL

使用一组值进行分组和计数