2017-12-22 9 views
0

を作成同じカテゴリ(BRAND)に属し、他の1つの変数(KM)に近い距離にあるすべての観測値の一定の変数(私の例では価格)の値です。SQL私の目的は私のSQLテーブルをIM(のはNEW_COL1 & NEW_COL2それらを呼びましょう)</p> <p>まず、NEW_COL1に私は平均がしたい2つの列を作成することであるカテゴリの平均値を持つ列を加えたいくつかのフィルタ

例:最初の観察のため (60 000キロでアウディ)私が持っているすべてのアウディの平均価格で横に列を持っていると思います20 000キロ以上または

少ない20 000キロ第二に、私は(複雑な結合なし)

は私が達成したい何(Original Image)を、簡単な操作を行う%カテゴリーの頻度を計算する方法がわからない:

+ -- + ------- + ------ + ----- + -------- + ----------- + _------- + -------------- + 
| ID | Brand | KM  | Price | NEW_COL1 |    | NEW_COL2 |    | 
+ -- + ------- + ------ + ----- + -------- + ----------- + _------- + -------------- + 
| 1 | audi | 60000 | 15000 | 14000 | MEAN(1,2) | 45%  | #audi/total | 
| 2 | audi | 80000 | 13000 | 13333.33 | MEAN(2,3,4) | 45%  |    | 
| 3 | audi | 90000 | 12000 | 12500 | MEAN(2,3) | 45%  |    | 
| 4 | audi | 120000 | 15000 | 7500  | MEAN(4,5) | 45%  |    | 
| 5 | audi | 130000 | 15000 | 7500  | MEAN(4,5) | 45%  |    | 
| 6 | Porsche | 60000 | 30000 | 28000 | MEAN(6,7) | 45%  | #porsche/total | 
| 7 | Porsche | 80000 | 26000 | 26666.67 | MEAN(6,7,8) | 45%  |    | 
| 8 | Porsche | 90000 | 24000 | 25000 | MEAN(7,8) | 45%  |    | 
| 9 | Porsche | 120000 | 16000 | 15000 | MEAN(9,10) | 45%  |    | 
| 10 | Porsche | 130000 | 14000 | 15000 | MEAN(9,10) | 45%  |    | 
| 11 | Porsche | 170000 | 8000 | 8000  | MEAN(11) | 45%  |    | 
+ -- + ------- + ------ + ----- + -------- + ----------- + _------- + -------------- + 

はあなたが持っていますか何か案が?

編集者注:NEW_COL1の後の列の説明とデータの順序に基づいて、ID 4,5,9,10のKMを120,000と130,000に変更しました。また、手段のいくつかの元の計算は間違っていたので、私もそれを更新しました。

+0

あなたの質問には適用されないタグを使用しないでください。実際に使用しているデータベースが不明なため、データベースタグを削除しました。実際に使用しているデータベースのみ*のタグを追加してください –

+1

どのdbms ??????構文はdbmsによって異なります。誰かが間違ったdbmsへの回答を投稿すると無駄です。だから正しくタグ! – Eric

+0

また、これまでに何を試しましたか? – Eric

答えて

0

相関サブクエリを使用できます。

select c.*, 
     (select avg(c2.price) 
     from cars c2 
     where c2.brand = c.brand and 
       c2.km between c.km - 20000 and c.km + 20000 
     ) as avg_price 
from cars c; 

あなたは「隣人」の数を取得するためにcount(*)の代わりavg()を使用することができます。ここでは一例です。

+0

ありがとうございます!それはまさに私が探していたものです。唯一の問題は、それが非常に遅いということです(600k行):o私の状況ではより効率的ですか? @MichelGala。 –

+0

。 。あなたは別の質問をして、パフォーマンスについて質問することもできます。しかし、「車(ブランド、km)」の指数はちょっと役立つはずです。 –

0

あなたはRDBMSを提供しなかったので、私はかなり一般的なsqlの答えを残そうとしました。ジョインはあなたにとって少し速いかもしれません。 NEW_COL1が、個人的にこの

select a.*, AVG(cast(b.Price as float)) as NEW_COL1 
    from Cars a 
    left join Cars b 
     on b.Brand = a.Brand 
     and b.KM between a.KM - 20000 and a.KM + 20000 
    group by a.ID, a.Brand, a.KM, a.Price 

を試す取得するには、私はクロスを使用したいクエリのこのタイプのために適用されますが、いないSQLのすべてのバージョンは、(私はMySQLの、あなたの探している)ことをサポートしています。 NEW_COL2を取得

は少しトリッキーですが、このようなものは、トリックを行う必要があります。

select a.*, AVG(cast(b.Price as float)) as NEW_COL1 
    , cast(cast((select COUNT(*) 
        from Cars x 
        where x.Brand = a.Brand 
        group by Brand 
    ) as float)/(select COUNT(*) from Cars) * 100 as int) as NEW_COL2 
    from Cars a 
    left join Cars b 
     on b.Brand = a.Brand 
     and b.KM between a.KM - 20000 and a.KM + 20000 
    group by a.ID, a.Brand, a.KM, a.Price 
関連する問題