Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回具有匹配值的连续行的查询_Sql_Sqlite_Datetime - Fatal编程技术网

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试图在一个语句中完成这一切。