Sql 返回具有匹配值的连续行的查询
假设我有下表:Sql 返回具有匹配值的连续行的查询,sql,sqlite,datetime,Sql,Sqlite,Datetime,假设我有下表: data_point (creation_datetime DATETIME PRIMARY KEY, data_point INTEGER); 我正在寻找一个SQL查询,它不仅会告诉我最近的条目是否有一个数据点值X,而且会告诉我在它之后有多少连续行的值也是X 例如,假设以下数据: creation_datetime data_point 2012-10-31 12:00:00 0 2012-10-31 11:55:00 0
data_point (creation_datetime DATETIME PRIMARY KEY,
data_point INTEGER);
我正在寻找一个SQL查询,它不仅会告诉我最近的条目是否有一个数据点值X,而且会告诉我在它之后有多少连续行的值也是X
例如,假设以下数据:
creation_datetime data_point
2012-10-31 12:00:00 0
2012-10-31 11:55:00 0
2012-10-31 11:50:00 0
2012-10-31 11:45:00 2
2012-10-31 11:40:00 0
如果X=0,我希望返回的数字是3,因为最近的值匹配X,接下来的两行也匹配它
我没有任何ID列或任何东西。如果需要的话,我可以加一个,但我想避免
declare @data_point table (creation_datetime DATETIME PRIMARY KEY, data_point INTEGER)
insert @data_point
select '2012-10-31 12:00:00', 0
union select '2012-10-31 11:55:00', 0
union select '2012-10-31 11:50:00', 0
union select '2012-10-31 11:45:00', 2
union select '2012-10-31 11:40:00', 0
declare @x integer
set @x = 0
--solution 1
select COUNT(*)
from @data_point
where data_point = @x
and creation_datetime >
(
select max(creation_datetime)
from @data_point
where data_point != @x
)
--solution 2
select COUNT(*)
from @data_point a
where data_point = @x
and not exists
(
select top 1 1
from @data_point b
where data_point != @x
and a.creation_datetime < b.creation_datetime
)
统计最后一条记录之后不是所需值的记录数
SELECT max(creation_datetime), data_point, count(*)
FROM data_points, (
SELECT max(creation_datetime) time_of_last_data_point
FROM data_points
WHERE data_point <> (
SELECT data_point FROM data_points ORDER BY creation_datetime DESC LIMIT 1
)
)
WHERE
creation_datetime > time_of_last_data_point
GROUP BY
data_point
统计最后一条记录之后不是所需值的记录数
SELECT max(creation_datetime), data_point, count(*)
FROM data_points, (
SELECT max(creation_datetime) time_of_last_data_point
FROM data_points
WHERE data_point <> (
SELECT data_point FROM data_points ORDER BY creation_datetime DESC LIMIT 1
)
)
WHERE
creation_datetime > time_of_last_data_point
GROUP BY
data_point
说明:
嵌套的select语句将找到条目2012-10-31 11:45:00 | 2。
外部选择仅限于2012-10-31 11:45:00之后添加的记录。
注意:要将其用于其他数据库,您必须对其进行一些清理
说明:
嵌套的select语句将找到条目2012-10-31 11:45:00 | 2。
外部选择仅限于2012-10-31 11:45:00之后添加的记录。
注意:要将其用于其他数据库,您必须对其进行一些清理。这是最简单、最优雅的解决方案。谢谢你的帮助。非常感谢。此解决方案适用于示例,但不适用于一般情况。例如,如果数据点是1,1,1,2,1而不是0,0,0,2,0,这将不起作用。@Lawrence-我读取需求的方式,示例中的x0是函数的输入。他想知道最近的值是否是给定的X,以及有多少个连续值是X。@Chad,这是有道理的,但是,它需要一个额外的语句来确定X。按照我理解这个问题的方式,OP试图在一个语句中完成这一切。这是最简单、最优雅的解决方案。谢谢你的帮助。非常感谢。此解决方案适用于示例,但不适用于一般情况。例如,如果数据点是1,1,1,2,1而不是0,0,0,2,0,这将不起作用。@Lawrence-我读取需求的方式,示例中的x0是函数的输入。他想知道最近的值是否是给定的X,以及有多少个连续值是X。@Chad,这是有道理的,但是,它需要一个额外的语句来确定X。按照我理解这个问题的方式,OP试图在一个语句中完成这一切。