2

次のデータがあります。

(1,'20120615 8:03:43 PM'),
(1,'20120615 8:03:43 PM'),
(1,'20120615 8:03:48 PM'),
(1,'20120615 8:03:53 PM'),
(0,'20120615 8:03:58 PM'),
(1,'20120615 8:04:03 PM'),
(1,'20120615 8:04:08 PM'),
(1,'20120615 8:04:13 PM'),
(1,'20120615 8:04:18 PM'),
(0,'20120615 8:04:23 PM'),
(1,'20120615 8:04:28 PM'),
(1,'20120615 8:04:33 PM');

私の望ましい結果は次のとおりです。

(1,'20120615 8:03:43 PM', 1),
(1,'20120615 8:03:43 PM', 1),
(1,'20120615 8:03:48 PM', 1),
(1,'20120615 8:03:53 PM', 1),
(0,'20120615 8:03:58 PM', 0),
(1,'20120615 8:04:03 PM', 2),
(1,'20120615 8:04:08 PM', 2),
(1,'20120615 8:04:13 PM', 2),
(1,'20120615 8:04:18 PM', 2),
(0,'20120615 8:04:23 PM', 0),
(1,'20120615 8:04:28 PM', 3),
(1,'20120615 8:04:33 PM', 3);

つまり、上記の順序のように、0 以外のデータをグループ化したいということです。

4

4 に答える 4

4

これがアイデアです。各グループの開始位置のフラグを作成します。これは実際1 - col1に上記のデータにあります。次に、このフラグの累積合計を取ります。ではない値の場合0、これはグループです。次のクエリは、計算に相関サブクエリを使用して、このアプローチを採用しています。

select t.col1, t.dt,
       (case when t.col1 = 0 then 0 else 1+grouping end)
from (select t.*,
             (select sum(1-col1)
              from t t2
              where t2.dt <= t.dt
             ) as grouping
      from t
     ) t;

SQL Server 2012 では、累積合計でこれを行うことができます。

select t.col1, t.dt,
       (case when col1 = 0 then 0
             else 1+sum(1 - col1) over (order by dt)
        end)
from t;
于 2013-07-25T10:33:47.807 に答える
3

これを試してみてください -

DDL:

DECLARE @temp TABLE (Col1 INT, Col2 DATETIME)

INSERT INTO @temp (Col1, Col2)
VALUES 
     (1,'20120615 8:03:43 PM'),
     (1,'20120615 8:03:43 PM'),
     (1,'20120615 8:03:48 PM'),
     (1,'20120615 8:03:53 PM'),
     (0,'20120615 8:03:58 PM'),
     (1,'20120615 8:04:03 PM'),
     (1,'20120615 8:04:08 PM'),
     (1,'20120615 8:04:13 PM'),
     (1,'20120615 8:04:18 PM'),
     (0,'20120615 8:04:23 PM'),
     (1,'20120615 8:04:28 PM'),
     (1,'20120615 8:04:33 PM')

クエリ:

;WITH cte AS 
(
     SELECT Col2, Col3 = ROW_NUMBER() OVER (ORDER BY Col2)
     FROM @temp t2
     WHERE t2.Col1 = 0
)
SELECT t.Col1, t.Col2, ISNULL(t2.Col3, 0) + t.Col1 
FROM @temp t
OUTER APPLY (
     SELECT TOP 1 Col2, Col3
     FROM cte t2
     WHERE t.Col2 > t2.Col2
          AND t.Col1 = 1
     ORDER BY t2.Col2 DESC
) t2

出力:

Col1        Col2                    Col3
----------- ----------------------- --------------------
1           2012-06-15 20:03:43.000 1
1           2012-06-15 20:03:43.000 1
1           2012-06-15 20:03:48.000 1
1           2012-06-15 20:03:53.000 1
0           2012-06-15 20:03:58.000 0
1           2012-06-15 20:04:03.000 2
1           2012-06-15 20:04:08.000 2
1           2012-06-15 20:04:13.000 2
1           2012-06-15 20:04:18.000 2
0           2012-06-15 20:04:23.000 0
1           2012-06-15 20:04:28.000 3
1           2012-06-15 20:04:33.000 3
于 2013-07-25T10:33:48.740 に答える
0

これを試してください。いくつかの列名とテーブル名を変更する必要があります

DECLARE @TABLE_COUNT BIGINT
DECLARE @LOOP_COUNT BIGINT=0
DECLARE @COULMN_A INT
DECLARE @COULMN_B DATETIME
DECLARE @COUNTER BIGINT=1
DECLARE @NEWTABLE TABLE(COULMN_A INT,COLUMN_B DATETIME,COUNTER INT)
SELECT @TABLE_COUNT= COUNT(*) FROM TABLE

WHILE @LOOP_COUNT<@TABLE_COUNT
BEGIN
SELECT @COULMN_A=COLUMN_A,@COULMN_B=COLUMN_B FROM TABLE
IF @COULMN_A=0
SELECT @COUNTER=@COUNTER+1

INSERT INTO @NEWTABLE VALUES(@COULMN_A,@COULMN_B,@COUNTER)

SELECT @LOOP_COUNT=@LOOP_COUNT+1
END

SELECT * FROM @NEWTABLE

理解に助けが必要な場合は、お手数をおかけください

これがうまくいくことを願っています

よろしく アシュトッシュ・アリア

于 2013-07-25T10:33:37.363 に答える