#sql #sql-server #max
#sql #sql-сервер #макс
Вопрос:
итак, я застрял на этой, кажется, простой проблеме.
У меня есть таблица с некоторой информацией
ID | Другой идентификатор |
---|---|
1 | 100 |
2 | 214 |
1 | 1156 |
3 | 1252 |
4 | |
1 | 240 |
Теперь мне нужны только строки с наибольшим значением в редактируемом запросе, например:
| ID | Other ID |
| -------- | -------------- |
| 2 | 214 |
| 1 | 1156 |
| 3 | 1252 |
| 4 | |
Но он должен быть доступен для редактирования, чтобы я мог изменить некоторые другие значения в этой таблице.
Я попытался создать запрос, в котором указаны все Max (дата), ID и объединить их с помощью JOIN. Но это делает запрос недоступным для редактирования
Надеюсь, я описал свою проблему достаточно хорошо, чтобы понять… Спасибо: D
Ответ №1:
Самый простой метод — использовать row_number()
:
select t.*
from (select t.*,
row_number() over (partition by id
order by otherid desc
) as seqnum
from t
) t
where seqnum = 1;
К счастью, SQL обрабатывает NULL
значения как меньшие, чем любое другое значение для целей сортировки, поэтому по убыванию order by
они помещаются последними.
Ответ №2:
ID OTHER ID
1 100
2 214
1 1156
3 1252
4
1 240
create table find_max(id number(2),other_id number(10));
insert into find_max values(1,100);
insert into find_max values(2,214);
insert into find_max values(1,1156);
insert into find_max values(3,1252);
insert into find_max values(4,null);
insert into find_max values(1,240);
commit;
with d as(
select * from find_max),
d2 as(select d.*,dense_rank() over(partition by id order by other_id desc nulls last) r from d
where id =1)
select * from d2
where r=:r;