0

DBでモデル化された自動車販売があるというインタビューの質問がありました。それぞれは、とテーブルCarを参照する自動車販売の物理的な自動車を表します。テーブルは、販売されたそれぞれを追跡します。は1つだけで構成されているため、販売されたすべてのユニークごとにレコードがあります。MakeModelSaleCarSaleCarSaleCar

Model問題は、自動車販売で最も売れた名前を見つけることでした。私は3レベルのネストされたクエリで答えました。インタビュアーは、集計を使用せずにテーブルを結合することに成功しただけの結合を使用した解決策を具体的に求めました。

他の2つの集計を使用しながら、以下の3つのテーブル(Car、Make、Sale)をどのように結合しますか?

これがスキーマの大まかなスケッチです。ここで最も売れModelたのは「カローラ」を返すはずです

Car

| carid|  modid | etc...
_________________
|  1   |    1   |
|  2   |    1   |
|  3   |    1   |
|  4   |    2   |
|  5   |    2   |

Make

| mkid |  name  |
_________________
|  1   | Toyota |
|  2   | Nissan |
|  3   |  Chevy |
|  4   |  Merc  |
|  5   |  Ford  |

Model

| modid|  name   | mkid |
________________________
|  1   |  Corolla|  1
|  2   |  Sunny  |  2
|  3   |  Carina |  1
|  4   |  Skyline|  2
|  5   |  Focus  |  5

Sale

|  sid |  carid | etc...
_________________
|  1   |    1   |
|  2   |    2   |
|  3   |    3   |
|  4   |    4   |
|  5   |    5   |

編集:

MS SQLServer2008の使用

必要な出力:

Model Name |  Count
_____________________
Corolla    |    3

すなわちCar、最も売れたモデル。テーブルには3つのカローラと2つのサニーだけがあり、CarテーブルSaleは他の販売の詳細を持つそれぞれに対応していることに注意してください。5つのSaleレコードは実際にはカローラ、カローラ、カローラ、スンヌ、サニーです。

4

4 に答える 4

3

を使用しているのでSQL Server 2008、 と を使用Common Table ExpressionWindow Functionます。

WITH recordList
AS
(
    SELECT  c.name, COUNT(*) [Count],
            DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) rn
    FROM    Sale a
            INNER JOIN Car b
                ON a.carid = b.carID
            INNER JOIN Model c
                ON b.modID = c.modID
    GROUP   BY c.Name
)
SELECT name, [Count]
FROM recordList
WHERE rn = 1
于 2013-01-30T13:12:11.360 に答える
2

インタビュアーがこれを尋ねるとき、彼らは通常、あなたがウィンドウ関数を使うと言ってほしいと思っています. モデルごとに分割された一意の昇順の数字を各販売に与えることができ、最大の販売数が最大数になります。

http://www.postgresql.org/docs/9.1/static/tutorial-window.html

于 2013-01-30T12:58:05.647 に答える
2

新しく追加された SQL Server 2008 タグに基づきます。別の RDBMS を使用している場合は、サブクエリのlimit代わりに使用topして、サブクエリの最後に配置する必要がありますtop_sold_car

select Make.name as Make, Model.name as Model
from (
    select top 1 count(*) as num_sold
    from Car
    group by modid
    order by num_sold desc) as top_sold_car
join Model
    on (top_sold_car.modid = Model.modid)
join Make
    on (Model.mkid = Make.mkid)
于 2013-01-30T12:58:14.960 に答える
2

次のクエリは oracle 11g で機能します。ここにフィドルリンクがあります

SELECT name FROM (
  SELECT model.name AS name FROM car  , sale , model
    WHERE car.carid=sale.carid
      AND car.modid=model.modid 
    GROUP BY model.name
    ORDER BY count(*) DESC )
WHERE rownum = 1;

または

SELECT name FROM (
  SELECT model.name AS name FROM car  natural join sale natural join model    
    GROUP BY model.name
    ORDER BY count(*) DESC )
WHERE rownum = 1;

出力

|    NAME |
-----------
| Corolla |
于 2013-01-30T14:03:19.997 に答える