0

私は通常、「ユーザー変数を含む式の評価順序は未定義」でselectあることを知っているため、同じステートメントで変数を安全に定義して使用することはできません。しかし、サブクエリがある場合はどうなるでしょうか。例として、次のようなものがあります。

select col1,
       (select min(date_)from t where i.col1=col1) as first_date,
       datediff(date_, (select min(date_)from t where i.col1=col1)
               ) as days_since_first_date,
       count(*) cnt
from t i
where anothercol in ('long','list','of','values')
group by col1,days_since_first_date;

サブクエリを繰り返す代わりに安全に使用する方法はありますか? もしそうなら、私は関数でそれを行うことができますか、またはサブクエリが最初に表示されたとき(またはいずれか)で実行できますか?(select @foo:=min(date_)from t where i.col1=col1)datediff


もちろん、できました

select col1,
       (select min(date_)from t where i.col1=col1) as first_date,
       date_,
       count(*) cnt
from t i
where anothercol in ('long','list','of','values')
group by col1,date_;

次に、簡単な後処理を行ってdatediff. または、2 つの別個のクエリを作成することもできます。しかし、それらはクエリとサブクエリで同じ変数を安全に定義して使用できるかどうかという私の質問には答えません。

4

1 に答える 1

1

まず、date_集計関数がないため、クエリはあまり意味がありません。任意の値を取得します。

そうは言っても、サブクエリを繰り返すことはできますが、なぜそれが必要なのかわかりません。サブクエリを使用するだけです:

select t.col1, t.first_date,
       datediff(date_, first_date),
       count(*)
from (select t.*, (select min(date_) from t where i.col1 = t.col1) as first_date
      from t
      where anothercol in ('long','list', 'of', 'values')
     ) t
group by col1, days_since_first_date;

ただし、前述したように、3 番目の列の値には問題があります。

注: これにより、サブクエリを具体化するための追加のオーバーヘッドが発生します。ただし、group byとにかくあるので、データは複数回読み書きされています。

于 2015-05-27T23:05:40.707 に答える