SQL查询SUM DATEDIFF MAX

时间:2013-04-12 11:43:45

标签: sql group-by sum datediff

我遇到了SQL-Query的问题。我想计算一个用过的应用程序的运行时间。但是在数据库中,日期值被插入多次一次。我只需要pk_date列的最高值,并且没有来自starttime列的重复条目。

这是SQL-Query:

SELECT DISTINCT Standortname,
DATEPART(YEAR,PK_Date) AS Jahr,
DATEPART(month,PK_Date) AS Monat,
Lizenzname,
COUNT(DISTINCT username) AS AnzahlUser,
SUM(DISTINCT DATEDIFF(minute,starttime ,pk_date))  AS RuntimeMinute,
endtime,
pk_date

FROM BenutzerLizenz,Benutzer,Abteilung,Lizenz,Standort
WHERE 
BenutzerLizenz.PK_ID_user=Benutzer.PK_ID_user
AND BenutzerLizenz.PK_ID_lic=Lizenz.PK_ID_lic
AND PK_ID_standort=FK_ID_standort
AND DATEPART(month,PK_Date) = '04'
AND DATEPART(YEAR,PK_Date) = '2013'
AND Lizenzname = 'iman_1st'
AND Standortname = 'Unterlüß'

GROUP BY
 Standortname,
 DATEPART(YEAR,PK_Date),
 DATEPART(month,PK_Date),
 Lizenzname,
 starttime,
 endtime,
 pk_date

结果如下:

... RuntimeMinute   starttime                   pk_date
    339         2013-04-11 11:05:00.0000000 2013-04-11 16:44:37.9650000
    346         2013-04-11 11:05:00.0000000 2013-04-11 16:51:25.4800000
    356         2013-04-11 11:05:00.0000000 2013-04-11 17:01:19.9670000
    475         2013-04-11 10:06:00.0000000 2013-04-11 18:01:15.6620000

前三个运行时来自同一个用户和会话,最后一个来自另一个用户和会话。我只想计算并计算相同开始时间和插入的最大日期(pk_date)的最后运行时间 - > 356 + 475是我想要的价值。

在另一个类似的查询中,所有值都被累积(列starttime,endtime,pk_date不包含在其中,因此查询构建所有用户的所有运行时值的总和)。我尝试使用DISTINCT和MAX(pk_date),但它没有按预期工作。我是否必须使用子查询?

2 个答案:

答案 0 :(得分:1)

我会使用RANK()函数。

SELECT * FROM
(
SELECT DISTINCT Standortname,
DATEPART(YEAR,PK_Date) AS Jahr,
DATEPART(month,PK_Date) AS Monat,
Lizenzname,
COUNT(DISTINCT username) AS AnzahlUser,
SUM(DISTINCT DATEDIFF(minute,starttime ,pk_date))  AS RuntimeMinute,
endtime,
pk_date,
RANK() Over (PARTITION BY username ORDER BY pk_date DESC) As Rank

FROM BenutzerLizenz,Benutzer,Abteilung,Lizenz,Standort
WHERE 
BenutzerLizenz.PK_ID_user=Benutzer.PK_ID_user
AND BenutzerLizenz.PK_ID_lic=Lizenz.PK_ID_lic
AND PK_ID_standort=FK_ID_standort
AND DATEPART(month,PK_Date) = '04'
AND DATEPART(YEAR,PK_Date) = '2013'
AND Lizenzname = 'iman_1st'
AND Standortname = 'Unterlüß'

GROUP BY
 Standortname,
 DATEPART(YEAR,PK_Date),
 DATEPART(month,PK_Date),
 Lizenzname,
 starttime,
 endtime,
 pk_date,
 username
) tmp where Rank=1

RANK()函数按ORDER BY定义的顺序对结果集的每一行进行排名。与PARTITION BY一起使用时,您可以进一步对数据进行分区以进行排名。

由于您已经拥有所需的数据,因此您将按username对结果进行分区,并对pk_date进行排名,以获得最高的数据。

答案 1 :(得分:0)

听起来你想要查询只保留每个开始时间和用户/会话组合的max(pk_date)。然后将该查询添加到FROM子句中(假设为adhoc)。然后你输入WHERE子句pk_date = adhoc.pkdate AND username = adhoc.username等......

简化示例:

(SELECT username, startdate, max(pk_date) as pk_date 
FROM <whatever> 
GROUP BY username, startdate) (= <new>)

现在,在您的主查询......

SELECT ... FROM ...,<new> adhoc 
WHERE adhoc.username = username 
AND adhoc.startdate = startdate 
AND pk_date = adhoc.pk_date ... 

这有帮助吗?