2017-12-14 8 views
-2

私の目標は、1st OLDまたは1st NEWのステータスが1st ENDに達するまでの時間を取得することです。例えば

:表1値を一致させて日差を実行するSQL

ID Day STATUS 
111 1 NEW 
111 2 NEW 
111 3 OLD 
111 4 END 
111 5 END 
112 1 OLD 
112 2 OLD 
112 3 NEW 
112 4 NEW 
112 5 END 
113 1 NEW 
113 2 NEW 

所望の結果は次のようになります

STATUS Count 

NEW 2 (1 for ID 111-New on day 1 to End on day 4,and 1 for 112-new on day 3 to End on day 5) 

OLD 2 (1 for ID 111-Old on day 3 to End on day 4, and 1 for 112-OLD on day 1 to End on day 5) 
+0

タグにつながります。例えば:Oracle、MySQL、SQL Server、Postgresなど。 –

+0

私は現在、現在msアクセスを使用していますが、まもなくSQLに移行します。いずれかが問題ありません。私はこの方法にもっと興味がある。 :) – TylerNG

+0

TylerNG我々は今、データベースの「ブランド」が何であるかを知る必要があります。なぜなら、「sql」は標準的なデータベースであり、異なる方法で実装しているからです。それは例えばMySQLのですか?オラクル? SQLite? Postgres? etc –

答えて

1

は、次のMySQLで利用可能なT-SQL(SQL Serverなど)であり、NOT。 dbmsの選択は、非常に多くのdbms固有の選択肢があるため、重要です。以下のクエリでは、どちらもまだMySQLに存在しない(しかし、いつでも) "ウィンドウ関数" row_number() over()common table expressionを使用する必要があります。このソリューションではcross applyも使用されていますが、SQL Server固有のものですが、PostgresおよびOracle 12にはlateral joinsを使用しています。

SQL Fiddle

MS SQL Serverの2014スキーマのセットアップ:1

CREATE TABLE Table1 
    (id int, day int, status varchar(3)) 
; 

INSERT INTO Table1 
    (id, day, status) 
VALUES 
    (111, 1, 'NEW'), 
    (111, 2, 'NEW'), 
    (111, 3, 'OLD'), 
    (111, 4, 'END'), 
    (111, 5, 'END'), 
    (112, 1, 'OLD'), 
    (112, 2, 'OLD'), 
    (112, 3, 'NEW'), 
    (112, 4, 'NEW'), 
    (112, 5, 'END'), 
    (113, 1, 'NEW'), 
    (113, 2, 'NEW') 
; 

問合せ:

with cte as (
     select 
       * 
     from (
     select t.* 
       , row_number() over(partition by id, status order by day) rn 
     from table1 t 
      ) d 
     where rn = 1 
    ) 
select 
     t.id, t.day, ca.nxtDay, t.Status, ca.nxtStatus 
from cte t 
outer apply (
    select top(1) Status, day 
    from cte nxt 
    where t.id = nxt.id 
    and t.status = 'NEW' and nxt.status = 'END' 
    order by day 
    ) ca (nxtStatus, nxtDay) 
where nxtStatus IS NOT NULL or Status = 'OLD' 
order by id, day 

Results

あなたが見ることができるように
| id | day | nxtDay | Status | nxtStatus | 
|-----|-----|--------|--------|-----------| 
| 111 | 1 |  4 | NEW |  END | 
| 111 | 3 | (null) | OLD | (null) | 
| 112 | 1 | (null) | OLD | (null) | 
| 112 | 3 |  5 | NEW |  END | 

は、そのステータス]列をカウントすることはNEW = 2とDBMSが使用されているOLD = 2

+0

ありがとうございました!私は一度私はssmsに移動するには、それを試してみる:) – TylerNG

関連する問題