2

我对 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) 但它没有按预期工作。我必须使用子查询吗?

4

2 回答 2

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以获得最高的数据。

于 2013-04-12T12:41:39.400 回答
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 ... 

这有帮助吗?

于 2013-04-12T12:12:25.263 回答