【问题标题】:Query returning consecutive rows with matching value查询返回具有匹配值的连续行
【发布时间】:2012-10-31 21:08:40
【问题描述】:

假设我有下表:

data_point (creation_datetime DATETIME PRIMARY KEY, 
            data_point INTEGER);

我正在寻找一个 SQL 查询,它不仅可以告诉我最新条目的 data_point 值是否为 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,接下来的 2 行也匹配它。

我没有任何 ID 列或任何东西。如果需要,我可以添加一个,但我想避免它。

【问题讨论】:

    标签: sql sqlite datetime


    【解决方案1】:
    select count(*) as num
    from data_point
    where creation_datetime > (
      select max(creation_datetime)
      from data_point
      where data_point <> 0
    )
    

    计算最后一个不是您想要的值的记录之后的记录数。

    【讨论】:

    • 这是最简单、最优雅的解决方案。感谢您的帮助。非常感谢。
    • 此解决方案适用于示例,但不适用于一般情况。例如,如果数据点是 (1,1,1,2,1) 而不是 (0,0,0,2,0),这将不起作用。
    • @Lawrence - 我阅读要求的方式,X(示例中为 0)是函数的输入。他想知道最近的值是否是给定的 X,以及有多少个连续的值是 X。
    • @Chad,这是有道理的,但是,它需要一个额外的语句来确定 X。按照我理解问题的方式,OP 试图在一个语句中完成所有操作。
    【解决方案2】:
    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之后添加的记录。

    注意:您必须稍微清理一下才能将其与其他数据库一起使用。

    【讨论】:

      【解决方案3】:
      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
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多