1

次のテーブルがあるとします。

data_point (creation_datetime DATETIME PRIMARY KEY, 
            data_point INTEGER);

最新のエントリの data_point 値が X であるかどうかだけでなく、その後に X が値として含まれる連続する行数を教えてくれる SQL クエリを探しています。

たとえば、次のデータがあるとします。

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 の場合、最新の値が X に一致し、次の 2 行も X に一致するため、ここで返される数値は 3 になります。

ID列などはありません。必要に応じて追加できますが、避けたいと思います。

4

3 に答える 3

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ます。

注: 他のデータベースで使用するには、これを少しクリーンアップする必要があります。

于 2012-10-31T23:41:56.207 に答える
2
select count(*) as num
from data_point
where creation_datetime > (
  select max(creation_datetime)
  from data_point
  where data_point <> 0
)

目的の値ではなかった最後のレコードの後のレコード数をカウントします。

于 2012-10-31T21:21:49.243 に答える
1
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
)
于 2012-10-31T21:20:02.723 に答える