【问题标题】:T-SQL - Filtering records based on a dateT-SQL - 根据日期过滤记录
【发布时间】:2013-06-23 23:00:56
【问题描述】:

我正在编写 SQL Server 查询,需要一个解决方案来过滤正确返回的行。

基本设置如下 - 我主要根据标识符从表中选择一堆记录。因此,对于给定的标识符,最初可能会返回 100 条记录。然而,在这 100 条记录中,有许多需要删除——不是因为它们是重复的,而是因为一条比另一条更新。所以我基本上只需要一种方法来根据最近创建/修改的任何记录来进一步过滤结果。

我知道理想情况下,这些“旧”记录不应该在数据库中,但我无法控制它。正在发生的事情本质上是人们随着时间的推移更新条目以反映新信息,但不是编辑“旧”条目,而是每次都输入一个新条目。因此,给定标识符可能有 3 个条目,但我只需要最近输入的那个。

在 T-SQL 查询字符串中是否有一种简单的方法可以做到这一点?它类似于 Access 查询中的“Last of”功能。我确实为每条记录设置了格式正确的日期列。

谢谢!

到目前为止我的查询字符串(请原谅 VB 语法):

    "SELECT *" & _
    "FROM Performance_Override " & _
    "WHERE ([Deal_Name] = " & "'" & Range("ID").value & "'" & " or" & _
    " [UNIQUE_ID] LIKE " & "'" & "%SPLIT_LOAN%" & "')" & " AND" & _
    " ([Scenario] = " & "'" & "BASE" & "')" & _
    "ORDER BY [Date] ASC; "

【问题讨论】:

  • 你是这个意思吗? stackoverflow.com/questions/1313120/…
  • 您可以只选择具有该 ID 的 DateTime 列的最大值,然后执行一条语句,删除具有相同 ID 的小于该日期的任何内容。
  • 如果您向我们展示您目前的查询,那也会有所帮助。

标签: sql tsql filtering


【解决方案1】:

选择是

select ID, max(datefield) 
from table 
group by ID 

您只需要一个选择还是要实际删除旧条目?

WITH TableTop AS
(
    SELECT ID, User, OrderDate
    ROW_NUMBER() OVER (ID BY OrderDate DESC) AS RowNumber
    FROM Table
) 
SELECT ID, User, OrderDate  
FROM TableTop 
WHERE RowNumber = 1;

【讨论】:

  • 这很简单!只是最大功能吧?我只需要担心选择,数据库将保留旧条目。如果您不介意,还有一个问题 - 我在数据库中有大约 70 个字段,我现在是否必须将它们全部输入而不是使用“SELECT *”?
  • 不幸的是 * 不起作用。但在 SSMS 中,只需右键单击表格即可创建选择。
  • 跟进 - 我现在收到一个错误,我的其他字段未包含在聚合函数或 group by 子句中 - 所以我还需要在group by 子句呢?
  • 更正除日期字段以外的所有字段。复制粘贴是你的朋友。
  • 好吧 - 事情仍然无法正常工作(尽管我显然在正确的轨道上)。在我包含两个条目之间不同的字段的范围内,它似乎包含同一记录的多个日期。例如,如果我只包含“ID”字段(两个日期都相同),那么它会正确过滤掉较旧的日期。但是,当我添加一个附加字段,例如“修改者”(在后续日期进行更改/更新的人)时,我将返回单个 ID 的多个记录(每个唯一 ID-Date 组合一个)。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多