sql >> データベース >  >> RDS >> Sqlserver

この SQL クエリを拡張して、k 個の最近傍を見つけるにはどうすればよいですか?

    TOP (1) WITH TIES を削除するとどうなりますか 内側のクエリから、上位の k を返すように外側のクエリを設定します 行?

    また、この修正が役立つかどうかも知りたいです。 TOP を使用するよりも効率的であるはずです :

    DECLARE @start FLOAT = 1000
            ,@k INT = 20
            ,@p FLOAT = 2;
    
    WITH NearestPoints AS
    (
         SELECT *
                ,T.g.STDistance(@x) AS dist
                ,ROW_NUMBER() OVER (ORDER BY T.g.STDistance(@x)) AS rn
         FROM Numbers 
         JOIN T WITH(INDEX(spatial_index)) 
         ON   T.g.STDistance(@x) <  @start*POWER(@p,Numbers.n)
         AND (Numbers.n - 1 = 0 
              OR T.g.STDistance(@x) >= @start*POWER(@p,Numbers.n - 1)
             )
    )
    SELECT * 
    FROM NearestPoints
    WHERE rn <= @k;
    

    注意 - 未テスト - ここでは SQL 2008 にアクセスできません。



    1. ORA-00904デコード・エイリアスの識別子が無効です

    2. DjangoIntegerRangeFieldの検証に失敗しました

    3. MySQLクエリが強制終了されても消えない

    4. ビジネスロジック:データベースまたはアプリケーション層