1

以下の列COUNT()OVER(ORDER BY)を作成するためにSQLで使用しようとしています。COUNTここで、COUNT は、購入日からイベント日までに現在の行の価格以上に販売されたチケットの数を示します。この場合、ベントは で発生しました1/15/13。たとえば、12/3/2012 to 1/15/13420 ​​ドル以上で 5 枚のチケットを販売したとします。もう 1 つの例は、12/25/12 to 1/15/136 枚以上のチケットを販売した場合です。

Excel では、数式は になります=+COUNTIFS([Price],">="&[@Price],[Date],">="&[@Date])。これがCOUNT列の計算方法です。

SQLでは、私が得た最も遠いものは下にあり、結果はSQL_COUNT列にあります。ご覧のとおり、機能しません。

SELECT DATE, PRICE, 
COUNT(PRICE) OVER (order by PRICE desc)
FROM O.ELEMENTS ELEMENTS
WHERE (DATE={ts '2013-01-15 00:00:00'})
ORDER BY PRICE DESC


PRICE   DATE        COUNT   SQL_COUNT
700 1/8/2013    2   2
700 1/10/2013   1   2
440 1/9/2013    2   3
420 12/3/2012   5   5
420 12/18/2012  4   5
400 12/11/2012  5   6
390 12/3/2012   7   7
370 8/29/2012   11  11
370 11/29/2012  10  11
370 11/29/2012  10  11
370 12/17/2012  5   11
360 10/18/2012  11  12
350 1/5/2013    5   14
350 1/9/2013    3   14
340 6/23/2012   20  20
4

1 に答える 1

2

ウィンドウ関数でこれを行うことができるかどうかはわかりません。相関サブクエリでそれを行うことができます:

select date, price,
       (select count(*) from o.elements e2 where e2.date >= e.date and e2.price >= e.price
       ) as YourCount
from o.elements e
WHERE (DATE={ts '2013-01-15 00:00:00'})
ORDER BY PRICE DESC

この問題は私を一日中悩ませました (幸いなことに、この日は仕事が少ない日でした)。この問題はウィンドウ関数だけでは解決できないのではないかと考えることが多くなり、驚いています。ウィンドウ関数は、各次元を個別に扱います。言い換えれば、order by句は次の次元を検討する前に、1 つの次元ですべてを調べます。

これを幾何学的に考えてみましょう。2 つの軸は価格と日付のディメンションです。データは実際には、これら 2 つの次元に沿った散布図です。特定の点によって、散布図が 4 つの象限に分割されます。探しているのは、D のポイント数です (価格と日付の両方が大きい場合)。

|  C   |  D
|------+------
|      |
|  A   |  B
 -------------

ちなみに、実際の値ではなく変数値のランクを使用する場合、幾何学的問題は本質的に同じです。

隣接する 2 つのリージョンのレコード数を簡単に取得できます。たとえば、C+D は次のとおりです。

count(*) over (order by price)

または、A+B の場合:

count(*) over (order by price desc)

問題は、次元の混合です。これらは、スペースを 2 つの異なる領域に分割する垂直線です。「D」だけを捉えた表現でそれらを組み合わせる方法はありません。2 つの値を減算することで AC のような値を得ることができますが、それでも役に立ちません。

これは、元の目標が不可能であることを証明するものではありません。1 つの次元で並べ替えを使用するだけでは不十分であることを示唆しているだけです。

2 番目のディメンションを追加してorder by price, dateも機能しません。価格に関係がない場合、これは何もせず、最初のケースに戻ります。価格によるランキングと日付によるランキングを合計 (または平均) するようなトリックは機能しません。結果の幾何学的解釈には 45 度の線があり、これは私たちが望んでいるものではありません。

私が知る限り、何らかの形式の自己結合が唯一の解決策です。私の元の回答(上部)のフォームは、おそらくこれを行う最も簡単な方法です。価格と日付のインデックスがあれば、効率的ですらあるはずです。

于 2013-01-22T15:42:07.547 に答える