Oracle,确定一行是该组中的最后一行

时间:2017-12-22 12:35:18

标签: sql database oracle

在下表中,我想删除或更新第二行(2,3,100,test2),当且仅当是会话的最后一行(100)时。

例如,可以修改第三行,因为它是按session_id = 100分组的最后一行,但不应删除/更新第一行和第二行。

我怎样才能提高效率呢?

您可以在下面的架构中看到的ID列是一个始终增加的自动生成的数字。

enter image description here

您可以在下面找到我的架构:

{{1}}

2 个答案:

答案 0 :(得分:0)

您可以使用以下方法删除行:

LEFT JOIN (SELECT DISTINCT h.brnd_fmly_desc_txt, h.brnd_fmly_id
FROM ext_ce.hero_brands_list h 
GROUP BY h.brnd_fmly_desc_txt, h.brnd_fmly_id) AS hl
on c.brnd_fmly_id = hl.brnd_fmly_id

类似的逻辑可以用于delete from test_t t where t.session_id = 100 and t.id = (select max(t2.id) from test_t t2 where t2.session_id = t.session_id);

答案 1 :(得分:0)

具有最大价值的父母是最后一位父母吗?如果是这样,您可以尝试使用下面的代码

DELETE FROM test_t b
 WHERE EXISTS (SELECT * 
                 FROM (SELECT A.*, MAX(parent) KEEP (DENSE_RANK LAST ORDER BY parent) OVER (PARTITION BY session_id) last_parent
                         FROM TEST_T A) a 
                WHERE a.last_parent = b.parent
                  and a.session_id = b.session_id)

或者,您可以使用LAST_VALUE函数,下面的示例查询

SELECT A.*, last_value(parent) OVER (order by session_id) last_value
  FROM TEST_T A
 ORDER BY SESSION_ID, PARENT DESC