当前位置: 首页 > 面试题库 >

如何根据阈值删除除某些记录以外的所有记录?

华建同
2023-03-14
问题内容

我有一个这样的表:

CREATE TABLE #TEMP(id int, name varchar(100))

INSERT INTO #TEMP VALUES(1, 'John')
INSERT INTO #TEMP VALUES(1, 'Adam')
INSERT INTO #TEMP VALUES(1, 'Robert')
INSERT INTO #TEMP VALUES(1, 'Copper')
INSERT INTO #TEMP VALUES(1, 'Jumbo')
INSERT INTO #TEMP VALUES(2, 'Jill')
INSERT INTO #TEMP VALUES(2, 'Rocky')
INSERT INTO #TEMP VALUES(2, 'Jack')
INSERT INTO #TEMP VALUES(2, 'Lisa')
INSERT INTO #TEMP VALUES(3, 'Amy')

SELECT *
FROM #TEMP


DROP TABLE #TEMP

我正在尝试删除具有3个以上具有相同ID的名称的记录,但要删除所有记录。因此,我试图得到这样的东西:

id  name
1   Adam
1   Copper
1   John
2   Jill
2   Jack
2   Lisa
3   Amy

我不了解如何编写此查询。我已经达到了保留一个记录但没有记录阈值的程度:

;WITH FILTER AS
(
    SELECT id 
    FROM #TEMP
    GROUP BY id
    HAVING COUNT(id) >=3 
)
SELECT id, MAX(name)
FROM #TEMP
WHERE id IN (SELECT * FROM FILTER)
GROUP BY id
UNION
SELECT id, name
FROM #TEMP
WHERE id NOT IN (SELECT * FROM FILTER)

给我:

1   Robert
2   Rocky
3   Amy

有什么建议?哦,对了,我不在乎合并时会保留哪些记录。


问题答案:

您可以使用CTE做到这一点

CREATE TABLE #TEMP(id int, name varchar(100))
INSERT INTO #TEMP VALUES(1, 'John')
INSERT INTO #TEMP VALUES(1, 'Adam')
INSERT INTO #TEMP VALUES(1, 'Robert')
INSERT INTO #TEMP VALUES(1, 'Copper')
INSERT INTO #TEMP VALUES(1, 'Jumbo')
INSERT INTO #TEMP VALUES(2, 'Jill')
INSERT INTO #TEMP VALUES(2, 'Rocky')
INSERT INTO #TEMP VALUES(2, 'Jack')
INSERT INTO #TEMP VALUES(2, 'Lisa')
INSERT INTO #TEMP VALUES(3, 'Amy')

SELECT *
FROM #TEMP;

WITH CTE(N) AS
(
 SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER BY id)
 FROM #Temp
)
DELETE CTE WHERE N>3;

SELECT *
FROM #TEMP;

DROP TABLE #TEMP


 类似资料:
  • 问题内容: 我有一对多关系的两个数据库表。数据如下所示: 结果集: 我想删除所有应用程序,但最新的除外。换句话说,每个学生都只能将一个应用程序链接到该应用程序。使用上面的示例,数据应如下所示: 我将如何构造我的DELETE语句以过滤出正确的记录? 问题答案: 考虑到评论中的长时间讨论,请注意以下几点: 上面的语句 将 在任何正确实现语句级读取一致性的数据库上运行,而不管语句运行时对表的任何更改。

  • 你好,我正在写一个服务围棋和Kafka,我需要实现一个删除所有endpoint,将删除所有记录从一个特定的主题。然而,我找不到一个合适的方法来做到这一点。我使用Sarama库为Kafka。 到目前为止,我能找到实现删除所有的唯一两种方法是删除主题,这似乎不是处理这个问题的有效方法,第二种方法是使用Sarama库中的函数,但是这函数删除偏移量小于相应分区给定偏移量的记录。这意味着我必须先得到最新的偏

  • 问题内容: 我有3个表MySQL(MyIsam): 如何删除所有没有消息也没有archivedMessage的用户? 问题答案: 您可以使用:

  • 我有一个文件夹,我希望拒绝访问,但我希望有一个子目录(及其所有文件和任何子目录)是可访问的。 .htaccess文件需要在“模块”中,因为它的子目录是用户提供的(它们是CMS的插件),每个用户提供的文件夹可能有一个“公共”目录,只有“公共”中的文件和文件夹才可以访问。

  • 问题内容: 这是我对源数据的插入语句。 我有我的源数据 该数据已经排序,和。 我正在尝试从中生成此输出: 这是从原始数据得出结果的逻辑: 对于带有,或的每个记录 A* :如果以下记录 B 具有,则: * 如果记录 乙 具有相同的日期部分如 甲 (忽略时间),同时消除记录 甲 和 乙 从结果。这就是为什么删除记录4、5、8和9的原因; 否则,如果记录 B 的值早于记录 A ,则将 A 的值更新为 B

  • DELETE命令用于从Cassandra表中删除数据。 您可以使用此命令删除完整的表或选定的行。 语法: 下面举个例子来演示如何从Cassandra表中删除数据。 我们有一个名为“”的表其中列(,, ),这个表中具有以下数据。 删除整行 要删除为的整行记录,请使用以下命令: 在执行上面语句之后,为 的行记录已被删除。 您可以使用SELECT命令验证它。 删除一个特定的列名 示例: 删除为的记录中的