2

columns(date,gr1,gr2,gr3)私は4つの列を持つテーブルを持っています。(gr)列には(aからf)までのグレードがあります。

date        gr1 gr2 gr3
2012-1-1    a   b   c
2011-11-31  b   d   c
2011-11-30  c   a   f
2011-11-29  a   b   f
2011-11-28  f   b   c
2011-11-27  a   c   d
2011-11-26  c   a   b

次のクエリを実行する必要があります。次の日に列の値に「a」の後に「f」の成績が続く場合は、どの列に成績があるかに関係なく、選択する必要があります。

私は初心者で、どんな助けでも大歓迎です...明けましておめでとうございます!

4

1 に答える 1

1

比較を行うときの 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 の成績があり、その後にaon11-27-11の成績が続いたことを示してf11-28-11ます。同様に、 on の成績があり、その後にaon11-29-11の成績が続きましf11-30-11。これらは、ルールを満たす唯一の結果である必要があります。

于 2012-12-31T18:36:55.967 に答える