在单个列上是不同的,但是根据未选择的条件从同一个表中返回一行

时间:2010-07-09 19:39:34

标签: sql sql-server sql-server-2005 distinct-values

我是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命令将其连接回原始表。我只是不能把所有的碎片放在一起。我真的很感激任何帮助。

git.github.com/469915

你可以在这里看到“Arbor Heights”和“Rainer Beach”等社区的问题示例

5 个答案:

答案 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