比較を行うときの 1 つの方法は、比較対象のレコードを同じ行にまとめることです。「当日から翌日まで」のレコードを比較したいので、日付が1日ずれている表同士を結合することができます。これはDATEDIFF
、2 つの日付間の日数差を計算する関数で行われます。
クエリ 1 :
select
today.*,
followingday.date as ndate, followingday.gr1 as ngr1,
followingday.gr2 as ngr2, followingday.gr3 as ngr3
from mytable today
join mytable followingday on DATEDIFF(followingday.date, today.date) = 1
これにより、次の結果が得られ、連続する日の値が前日と組み合わされます (すべての列に一意の名前が付けられるように、列の名前followingday
を のプレフィックスで変更しましたn
。そうしないと、すべてが結果セットに表示されません)。
結果 (デモ) :
| DATE | GR1 | GR2 | GR3 | NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 30 2011 00:00:00+0000 | c | a | f | December, 01 2011 00:00:00+0000 | b | d | c |
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f |
| November, 28 2011 00:00:00+0000 | f | b | c | November, 29 2011 00:00:00+0000 | a | b | f |
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c |
| November, 26 2011 00:00:00+0000 | c | a | b | November, 27 2011 00:00:00+0000 | a | c | d |
結果が 1 つの行にまとめられたので、データにロジックを適用できます。この場合、ルールは、「どの列の値がグレードを持っていても、次の日に 'a' の後に 'f' のグレードが続く」というルールです。したがって、いずれかの成績がa
当日の であり、その後にいずれかの成績がf
翌日の であることが続きます。
クエリ 2 :
...
where (today.gr1 = 'a' or today.gr2 = 'a' or today.gr3 = 'a')
and (followingday.gr1 = 'f' or followingday.gr2 = 'f' or
followingday.gr3 = 'f')
結果 (デモ) :
| DATE | GR1 | GR2 | GR3 | NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f |
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c |
結果は、 on の成績があり、その後にa
on11-27-11
の成績が続いたことを示してf
い11-28-11
ます。同様に、 on の成績があり、その後にa
on11-29-11
の成績が続きましf
た11-30-11
。これらは、ルールを満たす唯一の結果である必要があります。