【问题标题】:Microsoft SQL Server: Query to get single records when duplicate records exists for same ticket numberMicrosoft SQL Server:当同一票号存在重复记录时查询以获取单个记录
【发布时间】:2018-09-21 01:40:17
【问题描述】:

我正在尝试构建一个 SQL 查询以在我的表中返回最新更新的票号。每次工单有更新时,都会在表中创建另一条记录。每条记录的 ID 字段都是唯一的。

我尝试在子查询中使用 SELECT DISTINCT 语句和 MAX 函数,但无法获得所需的输出。

表格

ID     Ticket_Number  Priority  Assignee          Last_Updated_Date
21100        2          Low       Jerry          2018-9-13 15:10:01
21105        2         Medium     Chris          2018-9-15 23:10:08
21520        3          High      James, Alan    2018-9-14 08:10:11
22000        4          Low       Chris          2018-9-14 20:10:22
22150        4          High      Chris, Jerry   2018-9-16 11:00:00
23120        6          Low       Albert         2018-9-17 12:10:06
23220        7          High      Steve          2018-9-18 10:10:02

期望的输出

 ID     Ticket_Number  Priority  Assignee          Last_Updated_Date
21105        2         Medium     Chris          2018-9-15 23:10:08
21520        3          High      James, Alan    2018-9-14 08:10:11
22150        4          High      Chris, Jerry   2018-9-16 11:00:00
23120        6          Low       Albert         2018-9-17 12:10:06
23220        7          High      Steve          2018-9-18 10:10:02

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 如果您的 RDBMS 是 MS SQL Server,您可以使用 LAG 和 LEAD 或 ROW_NUMBER 等分析函数。
  • 这是 SQL Server

标签: sql sql-server tsql


【解决方案1】:

您可以使用ROW_NUMBER窗口函数:

SELECT ID, Ticket_Number, Priority, Assignee, Last_Updated_Date
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Ticket_Number ORDER BY Last_Updated_Date DESC) AS rn
    FROM yourTable
) t
WHERE t.rn = 1;

或使用共同相关的子查询

select ID, Ticket_Number, Priority, Assignee, Last_Updated_Date from t t1
where t.Last_Updated_Date  in (select max(Last_Updated_Date from t t2 )
                               where t2.Ticket_Number  =t1.Ticket_Number  
                               group by t2.Ticket_Number)

【讨论】:

  • 我的编辑:不要在外部查询中执行SELECT *,因为这将包括行号,这可能是 OP 不想看到的。
  • 感谢@ZaynulAbadinTuhin 查询删除了重复项。我现在看到的问题是,一些应该在结果中的票在我运行查询后没有显示出来。知道为什么吗?
  • @CWZY 此查询不适用于重复删除,因此如果您将其用于重复删除,那么是的,某些票号将丢失(那些不是重复的)
  • @ZaynulAbadinTuhin 感谢您的回复。知道为什么查询可能会排除某些记录吗?
  • @CWZY 我已经说过,在我之前的评论中..这个查询将始终选择每个票号的最新 Last_Updated_Date 条目,因此这些票号只有一个条目也属于该领域并丢失如果你使用它删除记录集,但如果你想删除,那么你必须在 where 条件下使用 rn1 或 rn>1
【解决方案2】:

尝试使用以下查询:

select a.* from yourtable a
inner join 
(select distinct Ticket_Number,max(Last_Updated_Date) as Last_Updated_Date from yourtable 
group by Ticket_Number) b
on a.Ticket_Number = b.Ticket_Number and a.Last_Updated_Date = b.Last_Updated_Date

【讨论】:

  • 您不需要与 group by 区分
  • @paparazzo 和 maheshparab 感谢您的回复。我尝试使用此查询,但现在一些票未显示在输出查询中。
【解决方案3】:
WITH cte AS 
(SELECT ROW_NUMBER() OVER (ORDER BY Last_Updated_Date DESC) rn,* FROM t)

SELECT TOP 1 * FROM cte WHERE rn=1 ORDER BY ID

如果您的 RDBMS 是 Microsoft SQL Server,我认为它会起作用。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多