Create Table testpo
( 
    poid Varchar2(10),
    ToDelete Varchar2(10)
);

Insert into testpo values (‘PO1’, ‘D’);
Insert into testpo values (‘PO1’, ‘N’);
Insert into testpo values (‘PO2’, ‘D’);
Insert into testpo values (‘PO3’, ‘D’);

我想创建一个存储过程来返回唯一的POID,但是如果同一POID有D和N,我只需要IsDelete=N的行

需要的输出:

PO1 N
PO2 D
PO3 D

推荐答案

如果您想要对唯一的poid优先排序ToDeleteN,则可以使用:

SELECT poid,
       ToDelete
FROM   (
  SELECT poid,
         todelete,
         ROW_NUMBER() OVER (PARTITION BY poid ORDER BY ToDelete DESC) AS rn
  FROM   testpo
)
WHERE  rn = 1

如果您想要DELETE个非唯一行(同样,优先保留ToDelete个值N),则可以使用:

DELETE FROM testpo
WHERE ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT ROW_NUMBER() OVER (PARTITION BY poid ORDER BY ToDelete DESC) AS rn
    FROM   testpo
  )
  WHERE  rn > 1
)

SELECT的输出和DELETE之后剩余的行数为:

POID TODELETE
PO1 N
PO2 D
PO3 D

如果你想把它作为一个过程,那么把它包装在一个CREATE PROCEDURE语句中,并返回一个SYS_REFCURSOR变量来包含输出.

fiddle

Sql相关问答推荐

Select /过滤postgr中的树 struct

如何转换和汇总行数

LAG函数通过丢弃空值返回前一行

我可以将INSERT语句与SELECT一起使用来创建条件吗?

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

使用`lag()`获取上一个时间戳

使用Kotlin Exposed SQL DSL Select 多个值并排序

是否可以为表中的所有列生成散列值?

如何从查询中的三个或更多个表中添加另一个相同的列?

将FLOAT转换为VARBINARY,然后再转换回FLOAT

最小非重复集的SQL查询

通过UPDATE SELECT更新表时出现问题

在 PostgreSQL 中生成时间序列查询

删除行而不使数据库超载

显示所有组并计算给定组中的项目(包括 0 个结果)

AdventureWorks 查询

具有分组条件的不同计数 (DAX)

SQL Server: 将JSON对象数组转换为表格格式

检索具有相同位置的最小和最大store 数量

超过100名员工的连续行