Sql 高级分区查询

Sql 高级分区查询,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个表,其中包含类似于以下列的内容: infopath_form_id (integer) form_type (integer) approver (varchar) event_timestamp (datetime) 此表包含infopath表单的审批历史记录,系统中提交的每个表单都有一个唯一的infopath表单id,用于存储此表单。每个表单的审批人数量不一致(因为它根据事务处理的值而不同),但是一个表单始终至少有两个

我有一个表,其中包含类似于以下列的内容:

infopath_form_id     (integer)
form_type            (integer)
approver             (varchar)
event_timestamp      (datetime)
此表包含infopath表单的审批历史记录,系统中提交的每个表单都有一个唯一的infopath表单id,用于存储此表单。每个表单的审批人数量不一致(因为它根据事务处理的值而不同),但是一个表单始终至少有两个审批人。每个审批任务将作为另一行写入表中,并且此表中仅存储以前审批的历史记录


我需要了解的是每种表单类型的批准之间的平均时间。我尝试过使用分区来解决这一问题,但由于每个表单没有固定数量的审批人,我陷入了困境。我应该如何处理这个问题?

我相信您希望:

SELECT infopath_form_id
     , DATEDIFF(Minutes,MIN(event_timestamp),MAX(event_timestamp))/CAST(COUNT(*)-1 AS FLOAT)
FROM Table
GROUP BY infopath_form_id
这将为您提供每个InfoPath表单id的第一个条目和最后一个条目之间的平均分钟数

使用的功能说明:

  • MIN()
    返回最早的日期
  • MAX()
    返回最新日期
  • DATEDIFF()
    返回给定单位中两个日期之间的差值(本例中为分钟)
  • COUNT()
    返回每个分组项目的行数(即InfoPath表单id)

  • 因此,只需将经过的总分钟数除以记录数的1,即可得出事件之间的平均分钟数。

    我相信您希望这样:

    SELECT infopath_form_id
         , DATEDIFF(Minutes,MIN(event_timestamp),MAX(event_timestamp))/CAST(COUNT(*)-1 AS FLOAT)
    FROM Table
    GROUP BY infopath_form_id
    
    这将为您提供每个InfoPath表单id的第一个条目和最后一个条目之间的平均分钟数

    使用的功能说明:

  • MIN()
    返回最早的日期
  • MAX()
    返回最新日期
  • DATEDIFF()
    返回给定单位中两个日期之间的差值(本例中为分钟)
  • COUNT()
    返回每个分组项目的行数(即InfoPath表单id)

  • 因此,只需将经过的总分钟数除以记录数(即事件之间的平均分钟数)的1即可。

    sql server没有称为
    integer
    的类型。你的意思可能是
    int
    @zespri是的,很明显;)sql server没有名为
    integer
    的类型。你的意思可能是
    int
    @zespri是的,很明显;)实际上,您想将其除以
    count(*)-1
    。实际上,您想将其除以
    count(*)-1