2

説明するのはちょっと難しいですが、この例から明らかなはずです。

テーブル テーブル:

 Name  State Time
 --------------------
 A     1     1/4/2012
 B     0     1/3/2012
 C     0     1/2/2012
 D     1     1/1/2012

したいと思う

 select * from TABLE where state=1 order by Time desc

さらに、状態 0 で状態 = 1 の行の次の行数を含む「スキップ」列を追加します。つまり、出力は次のようになります。

Name State Time      Skipped
A    1     1/4/2012  2        -- 2 rows after A where State != 1
D    1     1/1/2012  0        -- 0 rows after D where State != 1

2 つの連続する行が状態 = 1 にある場合、つまり、これらの行の間に 1 以外の状態にあるものがない場合にも、0 が報告されます。

ここでは CTE が必須のようですが、state != 1 の行をカウントする方法がわかりません。

(MS SQL Server 2008)

4

2 に答える 2

2

連続した日付に依存しないように、CTE を使用して RowNo を確立しました。

WITH CTE_Rows as 
(
    select name,state,time,
    rowno = ROW_NUMBER() over (order by [time])
    from MyTable
)
select name,state,time,
    gap = isnull(r.rowno - x.rowno - 1,0)
from
    CTE_Rows r
    outer apply (
        select top 1 rowno 
        from CTE_Rows sub 
        where sub.rowno < r.rowno and sub.state = 1
        order by sub.rowno desc) x
where r.state = 1

日付でやりたいだけなら、もっと簡単です-必要なのはouter apply:

select name,state,r.time,
    gap = convert(int,isnull(r.time - x.time - 1,0))
from
    MyTable r
    outer apply (
        select top 1 time 
        from MyTable sub 
        where sub.time < r.time and sub.state = 1
        order by sub.time desc) x
where r.state = 1

参考までに、使用されるテスト データは次のように作成されました。

create table MyTable
(Name char(1), [state] tinyint, [Time] datetime)

insert MyTable 
values
('E',1,'2012-01-05'),
('A',1,'2012-01-04'),
('B',0,'2012-01-03'),
('C',0,'2012-01-02'),
('D',1,'2012-01-01')
于 2012-06-19T23:12:44.990 に答える
0

では、どうぞ (少し面倒です):

SELECT U.CurrentTime, 
       (SELECT COUNT(*) 
        FROM StateTable AS T3 
        WHERE T3.State=0 
        AND T3.Time BETWEEN U.LastTime AND U.CurrentTime) AS Skipped       
FROM (SELECT T1.Time AS CurrentTime, 
             (SELECT TOP 1 T2.Time 
              FROM StateTable AS T2 
              WHERE T2.Time < T1.Time AND T2.State=1 
              ORDER BY T2.Time DESC) AS LastTime 
      FROM StateTable AS T1 WHERE T1.State = 1) AS U
于 2012-06-19T23:00:59.793 に答える