Как выбрать несколько столбцов из таблицы, гарантируя, что один конкретный столбец не содержит повторяющихся значений в SQL Server? - PullRequest
0 голосов
/ 19 сентября 2019

Таблица:

x_id---y---z_id------a-------b-------c
1------0----NULL----Blah----Blah---Blah
2------0----NULL----Blah----Blah---Blah
3------10---6-------Blah----Blah---Blah
3------10---5-------Blah----Blah---Blah
3------10---4-------Blah----Blah---Blah
3------10---3-------Blah----Blah---Blah
3------10---2-------Blah----Blah---Blah
3------10---1-------Blah----Blah---Blah
4------0----NULL----Blah----Blah---Blah
5------0----NULL----Blah----Blah---Blah

Мой запрос :

SELECT
    #temp.x_id,
    #temp.y,
    MAX(#temp.z_id) AS z_id
FROM #temp
GROUP BY 
    #temp.x_id

Ошибка : Column 'y' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Требование: Я хочу, чтобы x_id был уникальным, и я хочу выбрать максимальное значение z_id

Ожидаемый результат:

x_id---y---z_id------a-------b-------c
1------0----NULL---Blah----Blah-----Blah
2------0----NULL---Blah----Blah-----Blah
3------10---6------Blah----Blah-----Blah
4------0----NULL---Blah----Blah-----Blah
5------0----NULL---Blah----Blah-----Blah

1 Ответ

3 голосов
/ 19 сентября 2019

Ошибка, которую вы видите, является распространенной, и это происходит потому, что когда вы указываете GROUP BY x_id, вы говорите SQL Server возвращать одну запись для каждого значения x_id.Однако, когда вы выбираете y, неясно, , какое одно из многих возможных значений, которые вы хотите использовать.Следовательно, это приводит к ошибке.Один правильный подход будет использовать ROW_NUMBER:

SELECT TOP 1 WITH TIES x_id, y, z_id, a, b, c
FROM #temp
ORDER BY ROW_NUMBER() OVER (PARTITION BY x_id ORDER BY z_id DESC);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...