Microsoft SQL Server:当同一票证号存在重复记录时,查询以获取单个记录

Microsoft SQL Server:当同一票证号存在重复记录时,查询以获取单个记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试构建一个SQL查询,以返回表中最新更新的票证号。每次对票据进行更新时,它都会在表中创建另一条记录。每个记录的ID字段都是唯一的 我曾尝试在子查询中使用SELECT DISTINCT语句和MAX函数,但未能获得所需的输出 表格 ID Ticket_Number Priority Assignee Last_Updated_Date 21100 2 Low Jerry 2018-9-13 15:10

我正在尝试构建一个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

您可以使用
行号
窗口功能:

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 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)
我认为,如果您的RDBMS是MicrosoftSQLServer,那么它将起作用


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

尝试使用以下查询:

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

尝试使用以下查询:

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


您使用的是哪种DBMS?如果您的RDBMS是MS SQL Server,您可以使用滞后和超前或行数等分析功能。这是SQL Server您使用的是哪种DBMS?如果您的RDBMS是MS SQL Server,您可以使用滞后和超前或行数等分析功能。这是SQL Server我的编辑:在外部查询中不要执行
选择*
,因为这将包括可能OP不想看到的行号。谢谢@zaynulabadinguin在查询中删除了重复项。我现在看到的问题是,在我运行查询后,结果中应该包含的一些票证没有显示出来。知道为什么吗?@CWZY此查询不适用于重复删除,因此如果您使用此查询进行重复删除,则某些票号将丢失(这些票号不重复)@Zaynulabadinthin感谢您的回复。知道为什么查询可能会排除一些记录吗?@CWZY我在之前的评论中已经说过。。此查询将始终选择每个票号的最新上次更新日期条目,因此,如果您使用此方法删除,则这些票号只有一个条目也会落入该区域并从记录集中丢失,但如果您要删除,则必须在外部查询中的where condition my edit:Don do
SELECT*
中使用rn1或rn>1,因为这将包括可能OP不想看到的行号。谢谢@zaynulabadinguin在查询中删除了重复项。我现在看到的问题是,在我运行查询后,结果中应该包含的一些票证没有显示出来。知道为什么吗?@CWZY此查询不适用于重复删除,因此如果您使用此查询进行重复删除,则某些票号将丢失(这些票号不重复)@Zaynulabadinthin感谢您的回复。知道为什么查询可能会排除一些记录吗?@CWZY我在之前的评论中已经说过。。此查询将始终选择每个票号的最新上次更新日期条目,因此,如果使用此选项进行删除,则这些票证号只有一个条目也属于该区域,并从记录集中丢失,但如果要删除,则必须在不需要与组区分的条件下使用rn1或rn>1by@paparazzo谢谢你的回答。我尝试使用此查询,但现在一些票证没有显示在输出查询中。您不需要使用distinct with groupby@paparazzo谢谢你的回答。我尝试使用这个查询,但是现在一些票据没有显示在输出查询中。