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

上記の最初の 3 つのランタイムは同じユーザーとセッションからのもので、最後の 1 つは別のユーザーとセッションからのものです。同じ starttime から最後のランタイムをカウントして合計したいだけで、挿入された最大日付 (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 句に追加します (アドホックとしましょう)。次に、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 に答える