は、次の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
タグにつながります。例えば:Oracle、MySQL、SQL Server、Postgresなど。 –
私は現在、現在msアクセスを使用していますが、まもなくSQLに移行します。いずれかが問題ありません。私はこの方法にもっと興味がある。 :) – TylerNG
TylerNG我々は今、データベースの「ブランド」が何であるかを知る必要があります。なぜなら、「sql」は標準的なデータベースであり、異なる方法で実装しているからです。それは例えばMySQLのですか?オラクル? SQLite? Postgres? etc –