gpt4 book ai didi

sql - 陷入 t-SQL 中单个表上的选择性 DELETE 语句

转载 作者:行者123 更新时间:2023-12-02 06:39:06 25 4
gpt4 key购买 nike

比如说,我有一个这样的表(SQL Server 2008):

CREATE TABLE tbl (ID INT, dtIn DATETIME2, dtOut DATETIME2, Type INT)

INSERT tbl VALUES
(1, '05:00', '6:00', 1), -- will be removed
(2, '05:00', '7:00', 1), -- will be removed
(3, '05:01', '8:00', 1),
(4, '05:00', '8:00', 1),
(5, '05:00', '6:00', 2), -- will be removed
(6, '05:00', '7:00', 2),
(7, '05:00', '7:00', 3),
(8, '04:00', '7:00', 3)

我需要删除所有具有相同“类型”(如果找到 2 条或更多条记录)且“类型”具有相同“dtIn”的记录,但具有最大“dtOut”的记录除外。换句话说,上表的结果应该是这样的:

(3, '05:01', '8:00', 1),   -- no matching 'dtIn' for 'type' = 1
(4, '05:00', '8:00', 1), -- largest 'dtOut' for 'type' = 1
(6, '05:00', '7:00', 2), -- largest 'dtOut' for 'type' = 2
(7, '05:00', '7:00', 3), -- no matching 'dtIn' for 'type' = 3
(8, '04:00', '7:00', 3) -- no matching 'dtIn' for 'type' = 4

您如何从同一个表中选择多个具有相同类型的行。你不能做 select * from tbl where type=type....无论如何,我很感激这方面的一些帮助......

最佳答案

这是选择要删除的行的一种方法:

SELECT *
FROM tbl T1
WHERE EXISTS
(
SELECT *
FROM tbl T2
WHERE T1.Type = T2.Type
AND T1.dtIn = T2.dtIn
AND (
T1.dtOut < T2.dtOut
OR (T1.dtOut = T2.dtOut AND T1.id < T2.id)
)
)

这个查询也可以很容易地更改为实际删除行。只需将 SELECT * 更改为 DELETE T1。但是请在实际运行删除语句之前测试它是否执行您想要的操作。

在线查看它:sqlfiddle


更新

这是一种使用 ROW_NUMBER 的方法:

;WITH T1 AS (
SELECT id, ROW_NUMBER() OVER (PARTITION BY Type, dtIn
ORDER BY dtOut DESC, ID DESC) AS rn
FROM tbl
)
SELECT * FROM tbl
WHERE id IN
(
SELECT id
FROM T1
WHERE rn > 1
)

在线查看它:sqlfiddle

关于sql - 陷入 t-SQL 中单个表上的选择性 DELETE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com