我每隔1毫秒就会在SQL Server 2012表中存储大量测量值。每当在某些行中有3个或更多重复值时,我想删除中间重复项。此样本数据图像中的突出显示值是我要删除的值。有没有办法用SQL查询来做到这一点?
答案 0 :(得分:3)
您可以使用CTE
和ROW_NUMBER
:
WITH CteGroup AS(
SELECT *,
grp = ROW_NUMBER() OVER(ORDER BY MS) - ROW_NUMBER() OVER(PARTITION BY Value ORDER BY MS)
FROM YourTable
),
CteFinal AS(
SELECT *,
RN_FIRST = ROW_NUMBER() OVER(PARTITION BY grp, Value ORDER BY MS),
RN_LAST = ROW_NUMBER() OVER(PARTITION BY grp, Value ORDER BY MS DESC)
FROM CteGroup
)
DELETE
FROM CteFinal
WHERE
RN_FIRST > 1
AND RN_LAST > 1
答案 1 :(得分:1)
我确定必须有一种更有效的方法来执行此操作,但您可以将表连接到自身两次以查找列表中的上一个和下一个值,然后删除所有三个条目价值是一样的。
DELETE FROM tbl
WHERE ms IN
(
SELECT T.ms
FROM tbl T
INNER JOIN tbl T1 ON T.ms = T1.ms + 1
INNER JOIN tbl T2 ON T.ms = T2.ms - 1
WHERE T.value = T1.value AND T.value = T2.value
)
如果表格真的很大,我可以看到这个吹出的tempdb。
答案 2 :(得分:0)
是的,有
select * from table group by table.field ->value