2017-01-17 2 views
1

я следующую таблицу:TSQL - Получить последние строки, которые их название не является нулевым

======================== 
Id  SubCode Title 
======================== 
1  1  test1 
1  2  test2 
1  3  NULL 
1  4  NULL 
2  1  k1 
2  2  k2 
2  3  k3 
2  4  NULL 

Нет, я хочу, чтобы выбрать все строки, которые их название не null, например, для Id 1 затем запрос должен показать test2 и Id 2 он должен быть k3:

======================== 
Id  SubCode Title 
======================== 
1  2  test2 
2  3  k3 

Я написал этот вопрос:

select t.Id, t.SubCode, t.Title from Test t 
inner join (
    select max(Id) as Id, max(SubCode) as SubCode 
    from Test 
    group by Id 
) tm on t.Id = tm.Id and t.SubCode = tm.SubCode 

Но этот код дает неправильный результат:

======================== 
Id  SubCode Title 
======================== 
1  4  NULL 
2  4  NULL 

Любая идея?

+1

Итак, 'SubCode' определяет, сколько лет прошло запись? –

+0

@TimSchmelter Нет, как 'Id', так и' SubCode' являются ключами –

+2

Я не просил ключи, я спросил, как вы определяете, какая запись «старше», потому что вы «хотите выбрать последние строки»? Вы должны использовать 'datetime'-column- –

ответ

2

Вы забыли исключить NULLs, написав соответствующий WHERE пункт (where title is not null).

Однако такие проблемы (чтобы получить лучший/последний/... запись), как правило, лучше всего решаются с аналитическими функциями (RANK, DENSE_RANK, ROW_NUMBER) в любом случае, потому что с ними вы получаете доступ к таблице только один раз:

select id, subcode, title 
from 
(
    select id, subcode, title, rank() over (partition by id order by subcode desc) as rn 
    from test 
    where title is not null 
) ranked 
where rn = 1; 
2

Вам нужен Title is not null где положение в ваш внутренний выбор:

select t.Id, t.SubCode, t.Title from Test t 
inner join (
    select max(Id) as Id, max(SubCode) as SubCode 
    from Test 
    where Title is not null 
    group by Id 
) tm on t.Id = tm.Id and t.SubCode = tm.SubCode 
+0

Не знаю, почему я не рассматривал 'where clause' :)) кстати спасибо –

Смежные вопросы