3

選択列、集計値、および「selects-from-partitions」をどのように混合するのか疑問に思っています。これが重複した質問である場合はお知らせください。

私が意味することの例:

与えられたトランザクション ログの例:

ID     Food    Date     Cost
1      Apple   5/1/14   10
1      Apple   5/4/14   8
1      Apple   5/6/14   15
1      Pear    5/2/14   25
2      Apple   5/3/14   15

目標は、一意の ID と食品の組み合わせごとに、最初の購入のコスト (日付別)、最後の購入、および平均コストを選択することです。

出力は次のようになります。

ID   Food    First_Cost    Last_Cost     Avg_Cost
1    Apple   10            15            11
1    Pear    25            25            25
2    Apple   15            15            15

OVER - PARTITION (各 GROUP BY グループの最初の行を選択しますか? ) と、集計関数と一緒にグループ化 ( https://dba.stackexchange.com/questions/41494/select-first-row-grouping-add )を調べました。 -aggregate-function ) しかし、どちらもこの特定の質問に答えていないようです。

これは私が達成しようとしていることのコード例です:

select id
      ,food
      ,firstrow(cost) OVER(PARTITION BY id, food ORDER BY date asc as first_cost
      ,avg(cost) from table
group by id, food;

集計関数がオフになるため、を使用してROWNUMBER() OVER(PARTITION...)から where 句でフィルタリングすることも機能しないようです。

1 つの解決策は常に、最初のテーブル、最後のテーブル、平均のテーブルを作成し、3 つを結合することですが、よりクリーンなものを探しています。

EDIT : jpw のコメントから、Aster には first_value() ウィンドウ関数があります。ただし、問題は、並べ替えまたはパーティション化する列を groupby 句に含める必要があることです。彼の提案と 1 つの解決策は、すべての集計関数をウィンドウ関数に変更し、groupby を完全に削除することです。

よりクリーンな解決策またはこれが不可能であることの確認を見たいと思います!

4

2 に答える 2

0

クエリ:

select id
      ,food
      ,first_value(cost) OVER(PARTITION BY id, food ORDER BY exp_date asc) as first_cost
      ,first_value(cost) OVER(PARTITION BY id, food ORDER BY exp_date desc) as last_cost
      ,avg(cost) OVER(PARTITION BY id, food ORDER BY exp_date asc) as avg_cost
from sm_fruits

あなたを近づけます:

    id  Food    first_cost  last_cost   avg_cost
1   1   Apple   10          15          11.00
2   1   Apple   10          15          11.00
3   1   Apple   10          15          11.00
4   1   Pear    25          25          25.00
5   2   Apple   15          15          15.00
于 2016-04-11T23:21:50.157 に答える
-2

テーブルをそれ自体にクロス適用して (2 回)、最大/最小日付とその日付のアイテムのコストを取得できます。

十字架を読んで、その夕食を有用に適用してください

 select id
      ,food
      ,LastCost
      ,FirstCost
      ,avg(cost) from TABLE t1
       Cross APPLY(
                    SELECT MAX(date), cost AS LastCost FROM TABLE t2 WHERE t2.food = t1.food
                  ) maxdate
       Cross APPLY(
                    SELECT MIN(date), cost AS FirstCost FROM TABLE t3 WHERE t3.food = t1.food
                  ) mindate
group by id, food;
于 2015-02-25T21:15:18.380 に答える