Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按组查找最新记录的SQL_Sql_Sql Server_Grouping_Greatest N Per Group - Fatal编程技术网

按组查找最新记录的SQL

按组查找最新记录的SQL,sql,sql-server,grouping,greatest-n-per-group,Sql,Sql Server,Grouping,Greatest N Per Group,我的工作流应用程序有一个审批历史记录表,其中包含以下结构和一些垃圾数据: Table: [Approval] +--------------------------------------+-------+----------------+-------------------------+ | ID |Status | UserID | DateStamp | +----------

我的工作流应用程序有一个审批历史记录表,其中包含以下结构和一些垃圾数据:

Table: [Approval] +--------------------------------------+-------+----------------+-------------------------+ | ID |Status | UserID | DateStamp | +--------------------------------------+-------+----------------+-------------------------+ | 63DDD358-EF3B-4355-8251-00CDE8560B3E | 5 |User1 | 2014-12-09 11:53:40.423 | | 63DDD358-EF3B-4355-8251-00CDE8560B3E | 10 |User1 | 2014-12-09 11:53:40.423 | | 13F65DDC-73D8-48BB-87F4-0207DE47A6D9 | 5 |User2 | 2016-02-19 11:10:56.820 | | 13F65DDC-73D8-48BB-87F4-0207DE47A6D9 | 10 |User3 | 2016-02-19 11:10:56.820 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 5 |User1 | 2014-09-18 14:53:07.973 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 20 |User3 | 2014-09-18 14:56:07.177 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 60 |User1 | 2014-09-18 14:53:07.973 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 70 |User1 | 2014-09-18 14:56:08.177 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 70 |User1 | 2014-10-15 15:17:49.210 | | 5AB3C39E-8E2E-4935-BC6C-0226F444D7F2 | 90 | System | 2014-10-15 15:17:50.210 | +--------------------------------------+-------+----------------+-------------------------+ 状态代码均表示批准级别,90已完成,取消为99

在分组数据时,我需要通过查找顶行来查找尚未完成或取消的等待批准的请求。然后,这将用于发送电子邮件,提醒用户尚未获得批准

到目前为止,我有一个疑问:

SELECT a.ID,a.Status,a.ApproverID,A.DateTime FROM Approval a INNER JOIN ( SELECT MAX(DateTime) as MaxDate, Status FROM Approval WHERE Status not in (90,99) GROUP BY Status ) a1 ON a1.MaxDate = a.DateTime and a1.Status = a.Status 这会对数据进行分组,并提供最新的记录,但不会忽略已完成或取消的任何内容

谁能看出我哪里做错了

SELECT *
FROM
(
SELECT a.ID,a.Status,a.ApproverID,A.DateTime, 
       RN = ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY A.DateTime DESC)
FROM   Approval a
WHERE  NOT EXISTS
       (
           SELECT *
           FROM   Approval x
           WHERE  x.ID = a.ID
           AND    x.Status in (90, 99)
       )
) A
WHERE A.RN = 1
RN=1将按ID提供最新记录

“不存在”用于排除状态为90或99的ID

RN=1将按ID提供最新记录

“不存在”用于排除状态为90或99的ID,您可以使用:

第一个_值返回每个ID分区的顶行:如果此行的值为90或99,则整个分区将被过滤掉

如果要在任何时间筛选出值为90或99的ID分区,请使用以下查询:

SELECT ID, Status, UserID, DateStamp
FROM (
  SELECT ID, Status, UserID, DateStamp,
         COUNT(CASE WHEN Status IN (90,99) THEN 1 END) OVER 
         (PARTITION BY ID) AS cnt_status
  FROM Approval) AS t
WHERE  cnt_status = 0
您可以使用:

第一个_值返回每个ID分区的顶行:如果此行的值为90或99,则整个分区将被过滤掉

如果要在任何时间筛选出值为90或99的ID分区,请使用以下查询:

SELECT ID, Status, UserID, DateStamp
FROM (
  SELECT ID, Status, UserID, DateStamp,
         COUNT(CASE WHEN Status IN (90,99) THEN 1 END) OVER 
         (PARTITION BY ID) AS cnt_status
  FROM Approval) AS t
WHERE  cnt_status = 0

预期结果是什么?预期结果是什么?嗨,Giorgos,谢谢你的建议,我不知道第一个_值函数。在本例中,我使用的是SQL Server 2008,但将记住这一点以备将来参考Hi Giorgos,感谢您的建议,我不知道第一个_值函数。在本例中,我使用的是SQLServer2008,但请记住这一点,以备将来参考