我遇到了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),但它没有按预期工作。我是否必须使用子查询?
答案 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 ...
这有帮助吗?