2015-10-08 2 views
0

По-прежнему подмастерье к SQL здесь. У меня есть временная таблица с именем #everything, которая имеет следующие данные. (заголовки сокращены). Таблица temp имеет гораздо больше столбцов, чем это.Как запросить строки, которые имеют наибольшее значение столбца среди строк, которые имеют одинаковое значение для одного из столбцов. V.2

hh_key sub_id tier 
    1 1234 T1 
    2 2345 T2 
    3 4567 T4 
    3 4568 T3 

Я хочу вернуть строки с «лучшим» уровнем. В моем случае лучшее имеет самое низкое число после «T». Так вот мои желаемые результаты:

hh_key sub_id tier 
    1 1234 T1 
    2 2345 T2 
    3 4568 T3 

Я знаю, что это точный вопрос был задан вопрос и решен здесь: previous question но синтаксис при условии, в ответ не работает для меня. Все записи возвращаются, а не только те, которые имеют желаемые значения.

Это будет моя версия предыдущего ответа, и она не вернет подмножество значений. Все возвращается.

Select household_key, sm_subscription_id ,mytier 
from #everything 
where Mytier is not null 
and Mytier IN (select MIN(mytier) from #everything group by household_key) 
order by household_key 

Может ли быть фактом, что у меня есть более трех столбцов, запрошенных из таблицы, в качестве фактора?

ответ

0

Вы можете использовать ROW_NUMER():

SUBSTRING(tier, 2, LEN(tier) - 1) извлечет номера после 'T'. Вы можете использовать извлеченную строку и CAST ее до INT и использовать ее в пункте ORDER BY вашего ROW_NUMBER.

SQL Fiddle

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(
      PARTITION BY hh_key 
      ORDER BY CAST(SUBSTRING(tier, 2, LEN(tier) - 1) AS INT) 
     ) 
    FROM #everything 
) 
SELECT 
    hh_key, sub_id, tier 
FROM Cte 
WHERE rn = 1 
DROP TABLE #everything 
Смежные вопросы