对嵌套SQL语句中的DB项进行排序
我有个问题,我不能四处走动。通过下面的脚本,我根据一些标准得到了一些副本。我想根据具体情况对它们进行分类 O.SL_OBJ_LAST_更改了日期,并且只为每个源io获取最早的日期对嵌套SQL语句中的DB项进行排序,sql,oracle,Sql,Oracle,我有个问题,我不能四处走动。通过下面的脚本,我根据一些标准得到了一些副本。我想根据具体情况对它们进行分类 O.SL_OBJ_LAST_更改了日期,并且只为每个源io获取最早的日期 select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io from SL_PP01_FAQ01 F, SL_PP01_TRANS_META TM, SL_PP01_OBJ O, (select source_io, lang
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
SL_PP01_TRANS_META TM,
SL_PP01_OBJ O,
(select source_io, lang
from SL_PP01_TRANS_META M,
sl_pp01_obj obj
where lang <> 'de'
and M.sl_obj_id = obj.sl_obj_id
and obj.sl_obj_deleted_flag = 0
group by source_io, lang
having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
AND TM.lang = D.lang
AND TM.sl_obj_id = F.sl_obj_id
AND TM.sl_obj_id = O.sl_obj_id
and O.sl_obj_deleted_flag = 0
order by TM.source_io;
我希望的输出仅为每个源io的较旧日期:
sl_obj_id || sl_obj_last_changed_date || source_io
255018 || 25.01.2017 || 123456
568631 || 10.08.2014 || 789012
424524 || 05.05.2016 || 135791
有人知道如何实现这一点吗?您可以尝试使用行数窗口功能来实现
SELECT t1.* FROM (
SELECT t.*,ROW_NUMBER() OVER(PARTITION BY source_io ORDER BY sl_obj_last_changed_date ) rn
FROM youtable t
) t1
where rn = 1
这是完整的代码
我会使用JOIN而不是连接表,您可以尝试使用CTE让代码更清晰
with CTE AS (
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F
JOIN SL_PP01_TRANS_META TM ON TM.sl_obj_id = F.sl_obj_id
JOIN SL_PP01_OBJ O ON TM.sl_obj_id = O.sl_obj_id
JOIN (select source_io, lang
from SL_PP01_TRANS_META M,
sl_pp01_obj obj
where lang <> 'de'
and M.sl_obj_id = obj.sl_obj_id
and obj.sl_obj_deleted_flag = 0
group by source_io, lang
having count(M.sl_obj_id) > 1) D ON TM.lang = D.lang
WHERE TM.source_io = D.source_io
and O.sl_obj_deleted_flag = 0
order by TM.source_io
)
SELECT t1.* FROM (
SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY source_io ORDER BY sl_obj_last_changed_date ) rn
FROM CTE t1
) t1
where rn = 1
您可以尝试使用Row_number窗口函数来实现它
SELECT t1.* FROM (
SELECT t.*,ROW_NUMBER() OVER(PARTITION BY source_io ORDER BY sl_obj_last_changed_date ) rn
FROM youtable t
) t1
where rn = 1
这是完整的代码
我会使用JOIN而不是连接表,您可以尝试使用CTE让代码更清晰
with CTE AS (
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F
JOIN SL_PP01_TRANS_META TM ON TM.sl_obj_id = F.sl_obj_id
JOIN SL_PP01_OBJ O ON TM.sl_obj_id = O.sl_obj_id
JOIN (select source_io, lang
from SL_PP01_TRANS_META M,
sl_pp01_obj obj
where lang <> 'de'
and M.sl_obj_id = obj.sl_obj_id
and obj.sl_obj_deleted_flag = 0
group by source_io, lang
having count(M.sl_obj_id) > 1) D ON TM.lang = D.lang
WHERE TM.source_io = D.source_io
and O.sl_obj_deleted_flag = 0
order by TM.source_io
)
SELECT t1.* FROM (
SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY source_io ORDER BY sl_obj_last_changed_date ) rn
FROM CTE t1
) t1
where rn = 1
使用行数函数:
with cte1 (sl_obj_id, sl_obj_last_changed_date,source_io) as
(
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
SL_PP01_TRANS_META TM,
SL_PP01_OBJ O,
(select source_io, lang
from SL_PP01_TRANS_META M,
sl_pp01_obj obj
where lang <> 'de'
and M.sl_obj_id = obj.sl_obj_id
and obj.sl_obj_deleted_flag = 0
group by source_io, lang
having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
AND TM.lang = D.lang
AND TM.sl_obj_id = F.sl_obj_id
AND TM.sl_obj_id = O.sl_obj_id
and O.sl_obj_deleted_flag = 0
order by TM.source_io;
)
select * from
(
select sl_obj_id, sl_obj_last_changed_date,source_io, row_number() over(partition by source_io order by sl_obj_last_changed_date) as rn from cte1) a where rn=1
使用行数函数:
with cte1 (sl_obj_id, sl_obj_last_changed_date,source_io) as
(
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
SL_PP01_TRANS_META TM,
SL_PP01_OBJ O,
(select source_io, lang
from SL_PP01_TRANS_META M,
sl_pp01_obj obj
where lang <> 'de'
and M.sl_obj_id = obj.sl_obj_id
and obj.sl_obj_deleted_flag = 0
group by source_io, lang
having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
AND TM.lang = D.lang
AND TM.sl_obj_id = F.sl_obj_id
AND TM.sl_obj_id = O.sl_obj_id
and O.sl_obj_deleted_flag = 0
order by TM.source_io;
)
select * from
(
select sl_obj_id, sl_obj_last_changed_date,source_io, row_number() over(partition by source_io order by sl_obj_last_changed_date) as rn from cte1) a where rn=1
今天的提示:切换到现代的显式连接语法!更容易编写而不出错,更容易阅读和维护,并且在需要时更容易转换为外部联接。今天的提示:切换到现代的显式联接语法!更易于编写而无错误,更易于读取和维护,并且在需要时更易于转换为外部联接。