Совпадение характеристик, когда несколько атрибутов совпадают

Застрял с оператором 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

Живая демо

Другие вопросы по тегам