Как выбрать уникальные значения не используя 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