选择列表中每个公司的最大值,显示每个公司每天的最长价值

时间:2020-11-11 22:16:22

标签: sql sql-server tsql datetime greatest-n-per-group

我已经看过其他一些与此类似的问题,但是我发现没有什么可以让我到达那里。

我有一个包含多列的表,但是其中3列是Company,Date和WaitTime。

我想为每个公司和每天选择最长的等待时间。我想显示整个日期范围内的结果,显示每个公司以及该天的最长等待时间。

主表

 Company  |  Date |  WaitTime
 A          11/10     5.2
 A          11/10     5.1
 B          11/10     4.8
 B          11/10     4.7
 A          11/11     5.0
 A          11/11     5.1
 B          11/11     4.6
 B          11/11     4.5
 etc

所需结果

 Date  |  Company  |  WaitTime
 11/10    A           5.2
 11/10    B           4.8
 11/11    A           5.1
 11/11    B           4.6
 etc

我每天与每个公司都有数百次互动,所以我试图找到每天每个公司最长的等待时间。

我尝试过的最新版本是

 SELECT
 Top 1 with Ties 
 CAST(Timestamp as Date) As Date,
 Campaign as Company,
 (IVR_Time/60.0) as WaitTime

 FROM [Reporting].[dbo].[New_Five9_CallLog] a WITH (NOLOCK)

 Where a.Timestamp >= DATEADD(week, DATEDIFF(week,0,GETDATE())-1,-1)
 AND a.Timestamp < DATEADD(week, DATEDIFF(week,0,GETDATE()),-1)
 AND a.Call_Type = 'Inbound'

 Order By ROW_NUMBER() over (Partition By Campaign Order by Timestamp)

但是,这并不能完全显示我的需求。

2 个答案:

答案 0 :(得分:2)

您可以使用窗口功能。对于您的示例数据,它看起来像:

select *
from (
    select t.*, rank() over(partition by company, mydate order by waittime desc) rn
    from mytable t
) t
where rn = 1

date是不明确的(因为存在一个具有相同名称的数据类型),因此我将其重命名为mydate。如果该列实际上包含时间部分,则需要在排名之前将其删除,例如:

rank() over(partition by company, convert(date, mydate) order by waittime desc) rn

请注意,rank()允许使用最高领带。

答案 1 :(得分:0)

您想要按日期显示,请使用:

SELECT Top 1 with Ties . . . 
. . .
ORDER BY ROW_NUMBER() over (Partition By CONVERT(DATE, timestamp) Order by WaitTime DESC)

我不确定您的查询与您的问题有什么关系。它比您显示的数据复杂得多。

相关问题