【发布时间】:2016-03-04 12:15:28
【问题描述】:
我有一个需要每天修剪的数据集。它由定期将记录写入表的进程填充。
我目前有一个简单的查询:
DELETE FROM dataTable WHERE entryDate < dateadd(day, -5, GETDATE())
但问题是过程不可靠;可能有几天根本没有数据写入。
所以我真正需要的是一个可以追溯到 5 天(可能不连续)写入数据的天,而不是 5 个日历日的查询。
例如,如果我运行以下查询:
SELECT cast(entryDate as date) as LogDate
FROM dataTable
group by category, cast(entryDate as date)
order by cast(entryDate as date) desc
我可能会得到这样的结果:
Category Date
Foo 2015-11-30
Foo 2015-11-29
Foo 2015-11-26
Foo 2015-11-25
Foo 2015-11-21
Foo 2015-11-20 <-- Start Pruning here, not the 25th.
Foo 2015-11-19
Foo 2015-11-18
Bar 2015-11-30
Bar 2015-11-29
Bar 2015-11-28
Bar 2015-11-27
Bar 2015-11-26
Bar 2015-11-25 <-- This one is OK to prune at the 25th.
Bar 2015-11-24
Bar 2015-11-23
我需要查询一直回到 20 日才被删除。
【问题讨论】:
-
一种方法是使用子查询来确定“修剪日期”。
-
为什么不使用
Limit?DELETE FROM dataTable WHERE entryDate IN (--your query-- + LIMIT 5) -
DELETE FROM dataTable WHERE entryDate IN (SELECT cast(entryDate as date) as LogDate FROM dataTable group by anotherField, cast(entryDate as date) order by cast(entryDate as date) desc LIMIT 5) -
@wajeeh "'LIMIT' 附近的语法不正确
标签: c# sql sql-server tsql sql-server-2012