2

我是 Sql server 的新手,我的 MySql 背景还不错,没什么特别的。

我有一个有 5 列的表:

Neighbrhood
City
State
zip_code
zip_percent

查询的目标:提供城市内的社区(唯一)列表以及与最高 zip_percent 对应的 zip_code。因此返回 2 列:

Neighborhood
zip_code

其中 zip_code 是该社区的“最具代表性”,因为它具有最高的覆盖率或“zip_percent”

问题:由于一个社区可以重叠多个邮政编码,因此我很难将它们区分开来。distinct 子句阻止我按未选择的列排序。

不知何故,我认为我需要使用 zip_percent 列上的 MAX 命令将这个子查询加入到原始表中。我只是不能把所有的部分放在一起。我真的很感激任何帮助。

git.github.com/469915

您可以在此处查看“Arbor Heights”和“Rainer Beach”等社区的问题示例

4

5 回答 5

2

尝试使用 ROW_NUMBER:

SELECT Neighborhood, zip_code
FROM (
    SELECT 
        Neighborhood, zip_code,
        ROW_NUMBER() OVER (PARTITION BY Neighborhood
                           ORDER BY zippercent DESC) AS rn
    FROM neighbourhoods_zip
) AS T1
WHERE rn = 1
附近的邮政编码
亚当斯 98107   
阿尔基 98116   
乔木高地 98146   
大西洋 98144   
贝尔敦 98121   
苦湖 98133   
荆棘崖 98199   
ETC...
于 2010-07-09T19:53:15.823 回答
1
SELECT     Q1.Neighborhood, 
           Q1.Zip
FROM       TableName AS Q1
LEFT JOIN (SELECT Neighborhood, MAX(zip_percent) as Zip_Percent FROM TableName GROUP BY Neighborhood) AS Q2
ON         Q1.Zip_Percent = Q2.Zip_Percent 
AND        Q1.Neighborhood = Q2.Neighborhood

请记住,尽管这可能会在许多拉链共享最大拉链百分比的社区中产生意想不到的结果。例如

+------------------------------------+
| NeighborHood | Zip   | Zip Percent |
+------------------------------------+
|  A           | 91345 | 50          |
+--------------+-------+-------------+
|  A           | 91346 | 50          |
+--------------+-------+-------------+
于 2010-07-09T19:51:23.753 回答
0

您需要执行 group by 子句才能使 distinct 起作用。

DISTINCT 不适用于列,它适用于行。

所以你想要做的是一个子查询来获得最大的拉链。

SELECT MAX(ZipperCent) AS TheMax FROM YourTable
GROUP BY ZipCode

这将为您提供基于邮政编码的最大 zippercent,请记住,邮政编码可以跨越多个 postal_names。例如 98107 是西雅图,但 98116 也是。所以你不想按城市名称分组,按邮政编码分组。

现在您拥有每个邮政编码的最大 zippercents,您只需将其用作子查询来获取您需要的其他信息:

SELECT YourOtherField1, YourOtherField2, t.TheMax FROM YourTable INNER JOIN (SELECT MAX(ZipperCent) AS TheMax FROM YourTable GROUP BY ZipCode) t
ON t.YourPrimaryKey = YourTable.PrimaryKey
于 2010-07-09T19:51:43.070 回答
0

如果您autoincrement在表格上也有一个 ID 字段,那将是最好的,以便轻松处理max(zip_percent)每个社区有多个相同行的情况。减去这一点,这应该是大致正确的:

with max_zp as
  select
    Neighborhood,
    max(zip_percent) zp
  from
    tbl
  group by
    Neighborhood
select
  t.NeighborHood,
  t.zipcode
from
  tbl t
  join max_zp mz on t.Neighborhood = mz.Neighborhood and t.zip_percent = mz.zp
于 2010-07-09T19:51:48.630 回答
0
Select 
    Neighbrhood,
    zipcode

FROM
    geoTable g
INNER JOIN 

(   
SELECT

    zip_code,
    MAX(zip_percent) zip_percent
FROM
    geoTable
GROUP BY
        zipcode
) maxG
ON g.zip_code = maxG.zip_code
    and g.zip_percent = maxG.zip_percent
于 2010-07-09T19:52:30.970 回答