7

私は次のSQLを持っています:

select code, distance from places;    

出力は以下のとおりです。

CODE    DISTANCE            LOCATION
106     386.895834130068    New York, NY
80      2116.6747774121     Washington, DC
80      2117.61925131453    Alexandria, VA
106     2563.46708627407    Charlotte, NC

単一のコードと最も近い距離を取得できるようにしたい。だから私はこれを返したい:

CODE    DISTANCE            LOCATION
106     386.895834130068    New York, NY
80      2116.6747774121     Washington, DC

私はもともと次のようなものを持っていました:

SELECT code, min(distance), location
GROUP BY code
HAVING distance > 0 
ORDER BY distance ASC

最小距離に関連付けられた正しい位置を取得したくない場合は、最小値で問題なく機能しました。min(distance) と正しい場所を取得するにはどうすればよいですか (テーブル内の挿入の順序によっては、ニューヨークの距離でシャーロットの場所になる場合があります)。

4

3 に答える 3

8

正しい関連付けられた場所を取得するには、外側のメインテーブルの距離が副選択で導出された最小距離と一致することを条件として、コードごとの最小距離を取得する副選択に参加する必要があります。

SELECT a.code, a.distance
FROM   places a
INNER JOIN
(
    SELECT   code, MIN(distance) AS mindistance
    FROM     places
    GROUP BY code
) b ON a.code = b.code AND a.distance = b.mindistance
ORDER BY a.distance
于 2012-07-27T08:30:08.713 に答える
0

最小グループ化と元のテーブルの間でネストされたルックアップを試みることができます。

これはトリックを行うようです

SELECT MinPlaces.Code, MinPlaces.Distance, Places.Location 
FROM Places INNER JOIN
(
    SELECT Code, MIN(Distance) AS Distance
    FROM Places
    GROUP BY Code
    HAVING MIN(Distance) > 0 
) AS MinPlaces ON Places.Code = MinPlaces.Code AND Places.Distance = MinPlaces.Distance
ORDER BY MinPlaces.Distance ASC

更新: 以下を使用してテスト済み:

DECLARE @Places TABLE ( Code INT, Distance FLOAT, Location VARCHAR(50) )

INSERT INTO @Places (Code, Distance, Location)
VALUES
(106, 386.895834130068, 'New York, NY'),
(80, 2116.6747774121, 'Washington, DC'),
(80, 2117.61925131453, 'Alexandria, VA'),
(106, 2563.46708627407, 'Charlotte, NC')

SELECT MinPlaces.Code, MinPlaces.Distance, P.Location 
FROM @Places P INNER JOIN
(
    SELECT Code, MIN(Distance) AS Distance
    FROM @Places
    GROUP BY Code
    HAVING MIN(Distance) > 0 
) AS MinPlaces ON P.Code = MinPlaces.Code AND P.Distance = MinPlaces.Distance
ORDER BY MinPlaces.Distance ASC

これにより、次の結果が得られます。

ここに画像の説明を入力

于 2012-07-27T08:01:51.747 に答える
0

あなたはあなたのDBMSを言いませんでした。次のソリューションは、SQL Server 用です。

WITH D AS (
   SELECT code, distance, location,
      Row_Number() OVER (PARTITION BY code ORDER BY distance) Seq
   FROM places
)
SELECT *
FROM D
WHERE Seq = 1

一意のコードを持つテーブルがあり、Places テーブルに [Code, Distance] のインデックスがある場合は、CROSS APPLY ソリューションの方が優れている可能性があります。

SELECT
   X.*
FROM
   Codes C
   CROSS APPLY (
      SELECT TOP 1 *
      FROM Places P
      WHERE C.Code = P.Code
      ORDER BY P.Distance
   ) X

mysql の解決策はずっと後になるまで作業できません。

PS 掲載順序に頼ることはできません。試さないでください!

于 2012-07-27T08:03:54.823 に答える