Как выбрать уникальные значения не используя distinct?

SELECT dp.id_dep,
       dep.code_department,
       dp.code_place,
       vc.valuename,
       vr.valueseria,
       vr.nominal,
       vr.bаlrate,
       vr.dt_open,
FROM   valuerests vr
       JOIN valuecodes vc
         ON vr.id_value = vc.id_value
       JOIN valuekinds vk
         ON vc.id_valkind = vk.id_valkind
       JOIN place dp
         ON vr.id_place = dp.id_place
       JOIN department dep
         ON dp.id_dep = dep.id_department
WHERE  vk.code = 'AAA'
       AND vr.balrate > 0
       AND vr.dt_open = :p_dt
       AND dp.code_place = :p_cp 

Ответы (1 шт):

Автор решения: Noob_sai_Bot

может быть используя подзапрос, группировку строк и оконную функцию.

не уверен, что код сработает, но как-то так:

select * from
(
    SELECT dp.id_dep, 
    dep.code_department,
    dp.code_place,
    vc.valuename, 
    vr.valueseria,
    vr.nominal, 
    vr.bаlrate, 
    vr.dt_open, 
    FROM valuerests vr
    JOIN valuecodes vc
    ON vr.id_value = vc.id_value
    JOIN valuekinds vk
    ON vc.id_valkind = vk.id_valkind
    JOIN place dp
    ON vr.id_place = dp.id_place
    JOIN department dep
    ON dp.id_dep = dep.id_department
    WHERE vk.code = 'AAA'
    AND vr.balrate > 0
    AND vr.dt_open = :p_dt
    AND dp.code_place = :p_cp
)
where
ROW_NUMBER() OVER(PARTITION BY id_dep, code_department, code_place, valuename,valueseria,nominal,bаlrate, dt_open ORDER BY balrate DESC) = 1

суть в том, чтобы дать номера строкам в группировке и брать только те, где 1(то есть не повторяющиеся)

чтобы его запустить надо поэксперементировать, надеюсь идея окажется полезной :)

или:

select 
tbl.*,
    ROW_NUMBER() OVER(PARTITION BY id_dep, code_department, code_place, valuename,valueseria,nominal,bаlrate, dt_open ORDER BY balrate DESC) as ic
from
    (
        SELECT dp.id_dep, 
        dep.code_department,
        dp.code_place,
        vc.valuename, 
        vr.valueseria,
        vr.nominal, 
        vr.bаlrate, 
        vr.dt_open, 
        FROM valuerests vr
        JOIN valuecodes vc
        ON vr.id_value = vc.id_value
        JOIN valuekinds vk
        ON vc.id_valkind = vk.id_valkind
        JOIN place dp
        ON vr.id_place = dp.id_place
        JOIN department dep
        ON dp.id_dep = dep.id_department
        WHERE vk.code = 'AAA'
        AND vr.balrate > 0
        AND vr.dt_open = :p_dt
        AND dp.code_place = :p_cp
    ) tbl
where ic = 1

вот пример:

select * from (
    select t.*,
    ROW_NUMBER() OVER(PARTITION BY c1,c2,c3,c4 order by c2 DESC) as Ic
    from
    (
        select
        'AA' as c1,
        12 as c2,
        33.5 as c3,
        'BB' as c4
        UNION ALL
        select
        'AA' as c1,
        12 as c2,
        33.5 as c3,
        'BB' as c4
        UNION ALL
        select
        'AA' as c1,
        12 as c2,
        33.5 as c3,
        'BB' as c4
    ) t
)t2 where Ic = 1
→ Ссылка