【发布时间】:2013-04-12 11:43:45
【问题描述】:
我的 SQL 查询有问题。我想计算使用过的应用程序的运行时间。但是在数据库中,日期值被插入不止一次。我只需要 pk_date 列的最大值,并且 starttime 列中没有重复的条目。
这是 SQL 查询:
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) 但它没有按预期工作。我必须使用子查询吗?
【问题讨论】:
-
哪些字段是用户和会话? - 使用@d'alar'cop 回答
-
@d'alar'cop user 是列用户名。这算在上面的选择中。我想要一份报告,例如其中 3 个用户每月使用 800 分钟的应用程序。对于会话,我的意思是具有相同开始时间的行。像上面的开始时间是 11:05 用户从 11:05 到 17:01 使用程序。我只需要 pk_date 最大值之间的时间(仅累积 356 + 475)。