Совпадение характеристик, когда несколько атрибутов совпадают
Застрял с оператором SQL, который я использую для преобразователя InlineQuerier для FME. Обычно я не так много работаю с кодом SQL, а использую его только в том случае, если выполнять простые соединения один на один. Сейчас я работаю с одним фреймом данных, который содержит несколько атрибутов, и я хочу создать дополнительный атрибут на их основе. Краткий пример:
ID road_name road_type Type Traffic
1 bakerstreet elements B light
2 bakerstreet elements B light
3 piccadilly circus asphalt A heavy
4 woodstreet concrete A heavy
5 settlerstreet concrete A heavy
6 woodstreet concrete A heavy
7 settlerstreet concrete A heavy
8 settlerstreet concrete B heavy
Я пытаюсь дать всем функциям уникальный RoadID, основанный на всех 4 атрибутах, чтобы я мог объединить их позже. Новый атрибут RoadID должен быть типом данных Integer, а значение должно соответствовать уникальной комбинации из 4 атрибутов.
Результаты должны быть примерно такими:
ID road_name road_type Type Traffic RoadID
1 bakerstreet elements B light 1
2 bakerstreet elements B light 1
3 piccadilly circus asphalt A heavy 2
4 woodstreet concrete A heavy 3
5 settlerstreet concrete A heavy 4
6 woodstreet concrete A heavy 3
7 settlerstreet concrete A heavy 4
8 settlerstreet concrete B heavy 5
Я использую concat для этого, или должен ли простой оператор if тогда делать свое дело?
3 ответа
with src(ID,road_name, road_type, Type, Traffic) as (
select 1,'bakerstreet','elements','B','light' from dual union all
select 2,'bakerstreet','elements','B','light' from dual union all
select 3,'piccadilly circus','asphalt','A','heavy' from dual union all
select 4,'woodstreet','concrete','A','heavy' from dual union all
select 5,'settlerstreet','concrete','A','heavy' from dual union all
select 6,'woodstreet','concrete','A','heavy' from dual union all
select 7,'settlerstreet','concrete','A','light' from dual union all
select 8,'settlerstreet','concrete','B','heavy' from dual )
select a.*
,dense_rank() over( order by road_name, road_type, Type, Traffic )
from src a;
Проверь это.
используя DENSE_RANK():
with CTE as
(
select distinct * ,
max(id) over ( Partition by road_name,road_type, Type ,Traffic ) mn
from #TableName
)
select ID,road_name,road_type,Type,Traffic,dense_rank() over ( order by mn ) RowID
from CTE C
order by id
Выход:
Пытаться min
а также dense_rank
оконные функции:
Попробуй это:
select
Id, road_name, road_type, Type, Traffic,
dense_rank() over (order by min_id) roadId
from (
select
t.*,
min(id) over (partition by road_name, road_type, Type, Traffic) min_id
from your_table t
) t order by id