2010-07-09 46 views
2

我是新的SQL服务器,我的MySql背景只是体面的,没有例外。不同的单列,但基于未选择的条件从同一表返回一行

我有5列的表格:

Neighbrhood 
City 
State 
zip_code 
zip_percent 

查询的目标: 提供一个城市,具有最高zip_percent对应的ZIP_CODE内社区(唯一)的列表。因此返回2列:

Neighborhood 
zip_code 

凡ZIP_CODE是附近的“最具代表性”,凭借的是最高的覆盖率或“zip_percent”

问题的:由于附近可以重叠多zip_codes我有一个问题明显得到它们。独特的条款阻止我通过未被选中的列进行排序。

不知怎的,我想我需要把这个子查询,并使用zip_percent列上的MAX命令将它加入到原始表中。我不能把所有的东西放在一起。我真的很感激任何帮助。

git.github.com/469915

你可以在这里看到像“阿伯高地”和邻里问题的一个例子“雷纳海滩”

+1

产品名称为 “SQL服务器”,而不是 “MS SQL”。 – 2010-07-09 19:41:55

回答

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   | 
+--------------+-------+-------------+ 
+0

+1为左连接 – 2010-07-09 20:51:40

0

你需要做一个group by子句,以便不同的工作。

DISTINCT不能在列上工作,它在一行上工作。

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

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

这会给你一个基于邮政编码的最大拉链,记住一个邮政编码可以跨越多个邮政编码。例如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 
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 
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 
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 
 
Neighborhood zip_code 
Adams   98107 
Alki   98116 
ArborHeights 98146 
Atlantic  98144 
Belltown  98121 
BitterLake 98133 
Briarcliff 98199 
etc... 
相关问题