我是Sql服务器的新手,我的MySql背景只是体面的,没什么特别的。
我有一个包含5列的表格:
Neighbrhood
City
State
zip_code
zip_percent
查询的目标: 提供城市中的邻域列表(唯一)以及与最高zip_percent对应的zip_code。因此返回2列:
Neighborhood
zip_code
其中zip_code是邻居中“最具代表性”的,因为其覆盖率最高或“zip_percent”
问题:由于邻居可能会重叠多个zip_codes,因此我遇到了明显的问题。 distinct子句阻止我按未选择的列排序。
不知何故,我认为我需要使用此子查询并使用zip_percent列上的MAX命令将其连接回原始表。我只是不能把所有的碎片放在一起。我真的很感激任何帮助。
你可以在这里看到“Arbor Heights”和“Rainer Beach”等社区的问题示例
答案 0 :(得分: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...
答案 1 :(得分: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
请记住,这可能会在多个拉链共享最大拉链百分比的邻域中产生意外结果。 e.g。
+------------------------------------+
| NeighborHood | Zip | Zip Percent |
+------------------------------------+
| A | 91345 | 50 |
+--------------+-------+-------------+
| A | 91346 | 50 |
+--------------+-------+-------------+
答案 2 :(得分:0)
您需要执行group by子句才能使其工作。
DISTINCT不能在列的基础上工作。
所以你想要做的是获得最大拉链的子查询。
SELECT MAX(ZipperCent) AS TheMax FROM YourTable
GROUP BY ZipCode
这将根据邮政编码为您提供最大拉链,请记住邮政编码可以跨越多个邮政编号。例如98107是西雅图,但98116也是如此。所以你不想按城市名称分组,按邮政编码分组。
现在您拥有每个邮政编码的最大拉链数,只需将其用作子查询即可获取所需的其他信息:
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
答案 3 :(得分: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
答案 4 :(得分: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