我有一张事件表.我想删除某些多次出现的值,例如

CreateDate  EventCode
------------------------
2023-03-20  EMA
2023-03-21  EMD
2023-03-22  EMD
2023-03-22  EMF
2023-03-23  EMI
2023-03-24  EMI

EMI必须只出现一次,也只能出现从3月23日开始的第一个EMI.像EMD这样的其他重复项目可以保留.

所以结果应该是

CreateDate  EventCode
------------------------
2023-03-20  EMA
2023-03-21  EMD
2023-03-22  EMD
2023-03-22  EMF
2023-03-23  EMI

简单的GROUP BY将消除重复的EMD

下面是我try 使用示例SQL的方法:

DROP TABLE IF EXISTS #Movements

CREATE TABLE #Movements 
(
    CreateDate datetime2,
    EventCode nvarchar(3)
)

INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-20', 'EMA')
INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-21', 'EMD')
INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-22', 'EMD')
INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-22', 'EMF')
INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-23', 'EMI')
INSERT INTO #Movements (CreateDate, EventCode) VALUES ('2023-03-24', 'EMI')

SELECT * FROM #Movements

SELECT EventCode 
FROM #Movements
GROUP BY EventCode

推荐答案

这将处理两次或更多次发现EMI的情况:

select t.*
from #Movements t
LEFT JOIN (
  SELECT EventCode, MIN(CreateDate) as CreateDate
  FROM #Movements
  WHERE EventCode = 'EMI'
  GROUP BY EventCode
) s on s.EventCode = t.EventCode and t.CreateDate > s.CreateDate
where s.CreateDate is null

Demo here

Sql相关问答推荐

在数据分区内执行确定

GROUP BY和GROUP_CONCAT用于计算比赛排名

对于表A中的每一行,更新表B中与金额有关的行

SQL查询组类值在同一行中,并连接和排序其他值

R中对Arrow duckdb工作流的SQL查询

使用占位符向SQL INSERT查询添加 case

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

从包含PostgreSQL中的JSON值的列中提取列表或目录

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

了解多个分组集

我如何才能在付款人单列中拉出只有9个付款人单的人?

SQL递归.硬币兑换问题.-try 使用递归解决硬币找零问题

WooCommerce产品的SQL查询:获取sku和产品标签

STContains、STIntersections和STWithin返回错误的地理结果

使用 GROUP BY 时如何创建其他组?

具有日期时间条件的存储过程

PostgreSQL 如何在一组项目及其数量上找到完全相同的订单?

CURRENT_ROW 窗口框架上的 SQL 滞后

如何根据 ID 和指标从 2 个表中找到不同的值?

如何使用子查询锁定此查询中的选定行?