отличается от одного столбца, но возвращает строку из той же таблицы на основе невыбранного - PullRequest
2 голосов
/ 09 июля 2010

Я новичок в Sql server, и мой фон MySql только приличный, ничего особенного.

У меня есть таблица с 5 столбцами:

Neighbrhood
City
State
zip_code
zip_percent

Цель запроса: Предоставить список окрестностей (уникальных) в пределах города и zip_code, который соответствует наибольшему zip_percent. Таким образом возвращаются 2 столбца:

Neighborhood
zip_code

Где zip_code является "наиболее представительным" из района, в силу того, что имеет самый высокий процент покрытия или "zip_percent"

Проблемы: поскольку соседство может перекрывать несколько zip_codes, у меня возникла проблема с их четким определением. Отдельное предложение не позволяет мне упорядочить по невыбранному столбцу.

Почему-то мне кажется, что мне нужно взять этот подзапрос и присоединить его к исходной таблице с помощью команды MAX в столбце zip_percent. Я просто не могу собрать все кусочки вместе. Буду очень признателен за любую помощь.

git.github.com / 469915

Вы можете увидеть пример проблемы здесь с такими районами, как «Высоты Арбор» и «Пляж Рейнер»

Ответы [ 5 ]

2 голосов
/ 09 июля 2010

Попробуйте использовать 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 голос
/ 09 июля 2010
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 голосов
/ 09 июля 2010
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
0 голосов
/ 09 июля 2010

Было бы лучше, если бы у вас также было поле 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 голосов
/ 09 июля 2010

Вы должны сделать предложение group by для того, чтобы отличная работа.

DISTINCT не работает по столбцам, работает по строке.

Так что вы хотите сделать подзапрос, чтобы получить максимальный zippercent.

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
...