0

バス停とバス停から10ブロック以内のすべてのコーヒーショップを示すCOFFEEというテーブルがあるとします。

    BusStationID| CoffeeShopID |  Distance (in city blocks)
    1|2103|2
    1|2222|2
    1|8864|7
    1|9920|5
    1|3544|2
    1|4830|2
    1|4823|6
    1|9561|2
    7|6262|2
    7|8561|10
    7|9510|5
    7|2744|1       
    7|4223|9
    7|5960|3

[編集:問題は、手続き的ではないクエリでこれを行う方法であることを明確にするため]

そして、バス停ごとに、最も近い5つのコーヒーショップまでの平均距離を表示するクエリ(procではない)を作成する必要があります。

特定のバス停に最も近いコーヒーショップのトップ5を取得できます。

           select avg(top5.distance) as AvgDistToFiveClosest
           from
           (
           select top 5 distance from COFFEE where busstationid = 1
           order by distance
           ) as top5

しかし、それをサブクエリとして接続し、AvgDistToFiveClosestをメインクエリで返される列にするにはどうすればよいですか?

        select BusStationId,  AvgDistToFiveClosest
        from COFFEE...
         ??????

上記のサンプルデータを考えると、クエリは次を返す必要があります。

     BusStationID | AvgDistToFiveClosest
           1 | 2
           7 | 4
4

3 に答える 3

2

これはOracle(9g +)SQLコードであり、修正されました。単一のselectステートメントに対する回答が見つかりました。

with
distanceRanks as
(
  SELECT
    busstationid,
    distance,
    --rank the rows on the distance column from smallest to longest, and differentiate equal distances by rownum
    rank() over ( partition by busstationid
                  order by distance, rownum asc) as ranking
  FROM coffee
  ORDER BY 1 asc
)
SELECT busstationid, avg(distance)
FROM distanceRanks
WHERE ranking < 6
group by busstationid;
于 2012-08-06T18:46:10.333 に答える
1

これを試して:

SELECT c.BusStationID, AVG(c.distance)
FROM COFFEE c
WHERE c.CoffeeShopID IN 
(SELECT TOP 5 c2.CoffeeShopID FROM COFFEE c2 WHERE c2.BusStationID = c.BusStationID
ORDER BY c2.distance)
GROUP BY c.BusStationID
于 2012-08-06T21:12:38.980 に答える
0

これを試して

Select distinct busstationid , (select top 5 avg(distance) from coffee ce where ce.busstationid = b.busstationid order by distance) as AvgDistToFiveClosest
From coffee b
于 2012-08-07T05:48:20.890 に答える