2017-09-03 86 views
0

我有一个表在SQL Server 2016数据库,看起来像这样一个SQL Server 2016数据库表:修剪使用SQL Server代理作业

ID  Value Group  SYSDATE 
-------------------------------------  
1  85  X  '2017-08-15' 
2  87  Y  '2017-08-15' 
3  934  Z  '2017-08-15' 
4  85  X  '2017-08-14' 
5  87  Y  '2017-08-14' 
6  934  Z  '2017-08-14' 
7  85  X  '2017-08-13' 
8  87  Y  '2017-08-13' 
9  934  Z  '2017-08-13' 
7  85  X  '2017-08-12' 
8  87  Y  '2017-08-12' 
9  934  Z  '2017-08-12' 
.... 

的表是从通常是相同的相同的源数据但可能会改变。所以我每天都拉它。

我只想随时将数据保留在前两位SYSDATES中。

  1. 我没有在SQL方面经验丰富,并且希望得到关于如何执行查询的一些指导。

  2. 有人可以建议如何在工作代理中设置一个工作来做到这一点?

我想我可以弄清楚如何使用MAX得到最高的一个SYSDATE信息,但不是最高的两个日期。

任何帮助/指导/方向赞赏。

编辑

所需的输出:

ID  Value Group  SYSDATE 
------------------------------------ 
1  85  X  '2017-08-15' 
2  87  Y  '2017-08-15' 
3  934  Z  '2017-08-15' 
4  85  X  '2017-08-14' 
5  87  Y  '2017-08-14' 
6  934  Z  '2017-08-14' 

在表(即用SYSDATE删除所有数据比第二最新日期的)

+0

您可以在问题中添加预期的输出吗? – Nayak

+0

在您的示例数据中,预期的输出将是8/14和8/15的所有内容? – Jason

+0

请参阅编辑。 @Jason是的。 – Windstorm1981

回答

1

这个怎么样?其中一种方法:

SELECT ID, Value, GROUP, SYSDATE 
FROM TABLE_A 
WHERE SYSDATE IN (SELECT TOP 2 SYSDATE 
        FROM TABLE_A 
        ORDER BY SYSDATE DESC); 
+0

所以你需要在where语句中做一个子查询?这总是会抛出我。我不知道何时何地必须完成。 – Windstorm1981

+1

当你更频繁地使用它时,你会感觉更舒适:-) – Nayak

1

子查询获取日期不被删除。
where子句检查不被删除的日期。

DELETE TABLE_A 
SELECT * 
FROM TABLE_A 
WHERE CAST(SysDate AS DATE) NOT IN 
(
    SELECT TOP 2 dates 
    FROM 
    (
     SELECT DISTINCT CAST(SysDate AS DATE) AS dates 
     FROM TABLE_A 
    ) AS Dates 
    ORDER BY dates desc 
)