1

我不是数据库专家,甚至不知道如何解决这个问题。我敢肯定,对于了解 TSQL 并欢迎一些见解的人来说,这很简单。

我有一个包含邮政编码和 Eastings 和 Northings 的数据库。例子:

Postcode  Easting  Northing
---------------------------
HR74DW    365601   254668
B129DB    407863   284797

我想提供东距和北距值并返回最近的单个记录(即匹配的邮政编码)。所以,像:

SELECT TOP 1 Postcode 
FROM [PostcodeAddresses].[dbo].[FullPostcodeEastingNorthing] 
WHERE Easting (IS CLOSEST TO) 417940 
  AND Northing (IS CLOSEST TO) 284824.

我正在使用 .NET MVC 4,所以如果有人知道如何使用 LINQ 来做到这一点,它也会非常方便(但我仍然会对 TSQL 感到高兴。

提前谢谢了。

4

2 回答 2

0

尝试这个:

WITH CTE
AS
(
    SELECT
       postcode, 
       ABS(Easting  - 417940) AS MinEasting,
       ABS(Northing - 284824) AS MinNorthing
    FROM FullPostcodeEastingNorthing
)
SELECT postcode
FROM FullPostcodeEastingNorthing
WHERE ABS(Easting - 417940 ) = (SELECT MIN(MinEasting)
                                FROM CTE)
  AND ABS(Northing - 284824) = (SELECT MIN(MinNorthing)
                                FROM CTE);

在这里查看它的实际效果:

于 2013-04-14T10:05:50.533 回答
0

我正在使用@w0lf 的建议,因为它运行良好,而且数据库不是很大,查询的数量也很少——所以完全扫描的小延迟是可以接受的。

这是我用作示例的邮政编码:

SELECT [Postcode], [Easting], [Northing]
  FROM [PostcodeAddresses].[dbo].[FullPostcodeEastingNorthing]
  WHERE Postcode = 'GU147NL'
邮政编码 东向 北向
--------------------------
GU147NL 486871 156016

这是我使用@w0lf 的建议返回邮政编码的方法。您可以看到东向和北向与上面的不同,但它们很接近并且它确实返回了正确的邮政编码。

SELECT TOP 1 Postcode 
FROM [PostcodeAddresses].[dbo].[FullPostcodeEastingNorthing] 
ORDER BY (easting-486860)*(easting-486860) 
+ (northing-156007)*(northing-156007) 
ASC
邮政编码
--------
GU147NL

谢谢@w0lf!

于 2013-04-16T22:11:22.587 回答