2017-08-02 8 views
0

私は以下のようにいくつかの価格について平均を計算する必要があります。私はそのテーブル内の各レコードについてこれを行うことができますが、最初の5つの最新の日付レコードでのみこれを実行したい場合はどうすればいいですか?以下のクエリはその平均を提供しますが、すべてのものについては、私はトップ5のデート日付を探しています。これは、おそらくrow_number()を使用して解決することができますが、私はそのテーブル内のレコードのトンがあり、row_numberは一度に各行を処理するように遅すぎる可能性がありますこれを行うより良い方法はありますか?私はこれをSQLServer DB BTWでやろうとしています。同じテーブル内のレコードごとに上位5の平均をどのように得るのですか

select a.id, AVG(a.someprice) as avgPrice 
from 
(select p.id, p.date, calculateSomePrice(p.id, p.date) someprice 
from table1 p 
where p.id in (select id from table1)) a 
group by a.id 
; 

私が探しているものを明確にすることができるテーブルの例レコードを教えてください。私たちは、私のクエリ上で実行すると

id date   prc 
1 08/02/2017  1.5 
1 08/01/2017  2.5 
1 07/31/2017  3.5 
1 07/30/2017  1 
1 07/29/2017  4 
1 07/23/2017  4.5 
1 07/20/2017  5 
1 07/22/2017  5.5 
2 07/29/2017  1.5 
2 07/28/2017  2.5 
2 07/27/2017  4 
2 07/26/2017  4 
2 07/23/2017  5.5 
2 07/22/2017  3.5 
2 07/21/2017  5 
2 07/20/2017  0.5 
2 07/18/2017  4.5 

は今、私たちは、すべてのレコードのためにすべての平均値を取得するが、私は探しています何のことは、各IDの日付ごとのトップ5の平均。この場合、1と2の両方の場合。

以下のクエリでは、私が探しているid1の結果が得られますが、私のテーブルのすべてのIDに対してこれを行う必要があり、テーブルに481397362のレコードがあるので、ループでこれを行うのは理にかなっていません。

select a.id, AVG(a.somePrice) 
from ( 
     select top 5 p.id, p.date, calculateSomePrice(p.id, p.date) somePrice 
     from table1 p 
     where p.id = 1 
     order by p.date desc) a 
group by a.id; 
+2

これが何を行うことになっている: 'p.id)TABLE1からIDを選択する(中)A'? 'p'は' table1'のエイリアスなので、ロジックは不要です。 –

+0

@ Gordon Linoff、私はtable1内のすべてのIDの平均を計算したいので、そのテーブルからすべてのIdを取得し、それらの計算を価格で実行し、groupで親クエリの平均を計算するよりも必要です。ここでの唯一の問題は、同じテーブル内のすべてのIDの日付ごとの上位5つの結果のみをこの平均値として計算したい場合、そのIDの結果セット全体についてこれを計算していることです。 – user3314492

+0

idに関係なく、id? ので、ID 1のためのあなたの結果である [ID日付PRC] [1 2017年7月22日5.5] [1 2017年7月20日5] [1 2017年7月23日4.5] [1 07/29/2017 4] [1 07/31/2017 3.5] これは間違いありませんか? –

答えて

0

の場合私はあなたの要求を正しく理解しており、以下のように問い合わせることができます:

select a.id, AVG(a.someprice) as avgPrice 
from 
( select p.id, p.date, calculateSomePrice(p.id, p.date) someprice, 
     RowN = Row_Number() over(partition by p.Id order by p.[date] desc)  
    from table1 p 
) a 
Where a.RowN <= 5 
group by a.id 
; 
+0

私はこれを正しく理解したと思いますが、Row_Number()を使用すると非常にゆっくりと処理されます。私は自分のテーブルに481397362のレコードを持っています。私はあなたのクエリを実行して、15分以上経過してから実行しています。あなたはこれより速い何かがあると思いますか? – user3314492

+0

それはまだ25分後に実行されています。 – user3314492

+0

p.dateのデータ型とは何ですか?その関数calculateomeprice()の機能は何ですか?あなたはtable1にいくつのレコードがありますか? –

0

TOP 5のIDをピックアップして、averageを見つけることができます。

使用できる

select a.id, AVG(a.someprice) as avgPrice from (select p.id, p.date, calculateSomePrice(p.id, p.date) someprice from table1 p where p.id in (select TOP 5 id from table1 order by update_Date desc)) a group by a.id;

+0

それは私の必要条件ではありません。テーブル1内のすべてのレコードについてこの平均値を求めたいと思います。したがって、TOP 5 idsを選択すると、結果セット全体で平均値を取得できません。 – user3314492

0

このようにそれを行う:あなたのクエリとサンプルの結果に基づいて

select a.id, AVG(a.someprice) as avgPrice 
from 
( select TOP 5 p.id, p.date, calculateSomePrice(p.id, p.date) someprice 
    from table1 p 
    ORDER BY P.DATE DESC 
) a 
group by a.id 
; 
+0

いいえ、これは私がIDごとにトップ5を与えることはありません。あなたのクエリは、私がトップ5のレコードをカウント平均よりも各IDで探しているところで、テーブル全体からトップ5を与えます。 – user3314492

+0

より正確な回答を得るために、いくつかのデータと期待される結果を共有したいとお考えですか? –

+0

サンプルレコードを追加したところです。あなたがもっと必要ならば教えてください。 – user3314492

0

、我々はDESC

であなたのトップ5 avgPriceをタグ付けする必要が
WITH cte AS (
SELECT a.id, 
     AVG(a.someprice) as avgPrice 
    FROM (SELECT p.id, 
       p.date, calculateSomePrice(p.id, p.date) someprice 
      FROM table1 p 
     WHERE p.id in (SELECT id 
          FROM table1) 
         ) a 
GROUP BY a.id 
) 

SELECT id, 
     avgPrice 
    FROM (SELECT id, 
       avgPrice, 
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY avgPrice DESC) rank 
      FROM cte 
     GROUP BY id, 
        avgPrice 
     ) t 

WHERE rank <=5 
+0

いいえ、トップ5のみの平均を計算する必要があります。最初に平均を計算すると、正しい値ではありません。私の質問で行った更新を確認してください。 – user3314492

+0

サンプルに基づいてクエリを編集しました。 –

+0

@Fedinand、最近のクエリは機能しますが、結果を実行するのに47.58分かかります。私が以前に言及したように、私のテーブルには481397362のレコードがあり、その場合ROW_NUMBER()を実行すると非常にコストがかかります。 – user3314492

0

からavgPrice AS SELECT a.id、平均(a.prc)( SELECT * ( SELECT ID、日付、PRC、ランク()FROM)日付DESC BY ID ORDER BYパーティション(上ランクAS a.id

によってテーブル FROM )RSランク< = 5 ) グループ
関連する問題