1

アグリゲートインラインhaving()内で何かリンクを使用する可能性はありますか?min()

select distinct
  "timestamp"
  , MinActiveValue = min( "value" ) over ( partition by "timestamp" ) having ( "active" = 1 )
from
  "data"

以下のリンクされた例では、最初のクエリを使用するとうまく機能します。実際、同じクエリで使用されているデータフィルタリングを破棄するため、min-conditionにwhere句を使用する必要はありません。(たとえば、同じクエリによって計算されたグループ化された合計がいくつかあります)

SQLフィドルリンク

4

2 に答える 2

2

これは必要ありませんでしHAVINGた。ちょうどそのようにGROUP BY "timestamp"WHERE "active" = 1

SELECT
  "timestamp"
  , MinActiveValue = MIN( "value" )
FROM  "data"
WHERE "active" = 1
GROUP BY "timestamp";

更新されたSQLフィドルデモ

于 2012-11-15T11:57:24.287 に答える
1

おそらくこれ:

WITH CTE AS
(
   SELECT DISTINCT
      timestamp
    , active
    , value
    , RN = ROW_NUMBER() OVER ( PARTITION BY timestamp ORDER BY active DESC,value ASC )
  FROM
    data
)
SELECT timestamp, value AS MinActiveValue
FROM CTE
WHERE RN = 1 AND active = 1

ここで、CTE自体にフィルターを適用できます。

デモ

于 2012-11-15T11:57:34.560 に答える