2017-04-12 11 views
0

テーブルdbo.AllAppsは、実行されたすべての実行可能ファイルをログに記録し、exeハッシュ値を格納する列ApplicationHash、exeを実行したUserIDを格納する列UserNameを保持します。SQL Server:追加のCOUNT列で結果を1行に返します

exeが10回実行された場合、テーブルには同じ情報がありますが、タイムスタンプとそのインスタンスを実行したユーザーが異なるエントリが10個あります。

私は10の1行(すべての列time、name、desc ...)だけでなく、exeが持つ回数のカウントを提供する列を返すレポートを生成したいと思います実行された行数(この例では合計行数10)と、exeを実行した一意のユーザー数のカウント(この例では3)です。

提案がありますか?

ApplicationHash TimeStamp UserName 
----------------------------------- 
ABCDE12345  00:00:05 User1 
ABCDE12345  00:02:05 User2 
ABCDE12345  00:04:05 User1 
ABCDE12345  00:10:05 User3 
ABCDE12345  00:15:05 User3 
ABCDE12345  00:20:05 User1 
ABCDE12345  00:21:05 User2 
ABCDE12345  00:33:05 User2 
ABCDE12345  00:45:05 User1 
ABCDE12345  00:55:05 User1 

結果は次のようにsomethineする必要があります:

ここ
ApplicationHash ProcessCount UserCount 
-------------------------------------- 
ABCDE12345   10   3 

は、誰かがいるとProcessCount問題を解決しない思い付いたものですが、私はユニークなユーザー名が同様に数える必要があります。

declare @StartDate datetime = '20170401'; 
declare @EndDate datetime = '20170406'; 

select top 1 with ties 
    ProcessCount = count(*) over (partition by ApplicationHash) 
    , ApplicationHash 
    , ProcessStartTime 
    , ApplicationType 
    , Description 
    , Publisher 
    , ProductName 
    , ProductVersion 
    , EventDescription 
    , CommandLine 
    , FileName 
from dbo.AllApps aa 
where TokenType = 'Elevated' 
    and ApplicationType != 'com Class' 
    and ApplicationType != 'ActiveX Control' 
    and ProcessStartTime >= @StartDate 
    and ProcessStartTime < @Enddate 
    and ProductName = 'WizSvcUt Application' 
order by row_number() over (partition by ApplicationHash order by ProcessStartTime desc) 
+1

この小文字を短くしてください。 – niksofteng

答えて

0

count(distinct userName)を一時テーブルに追加できます。私もあなたの暗黙の明示的に参加する参加変更しました:

/* !!!!!DEFINE START AND END DATE FOR REPORT HERE!!!!!*/ 
DECLARE @StartDate DATETIME = 2017-01-01 
DECLARE @EndDate DATETIME = 2017-01-02 

/* Checks if the temp table #PCount exist and deletes the table if it does */ 
IF OBJECT_ID('tempdb..#PCount') IS NOT NULL 
BEGIN 
    DROP TABLE #PCount 
END 

/* Performs a COUNT on the ApplicationHash entries and distinct user names*/ 
SELECT ApplicationHash, 
     COUNT(ApplicationHash) AS ProcessCount, 
     COUNT(DISTINCT UserName) As UserCount 
INTO #PCount 
FROM dbo.AllApps 
WHERE TokenType = 'Elevated' 
    AND ApplicationType != 'COM Class' 
    AND ApplicationType != 'ActiveX Control' 
    AND ProcessStartTime >= @StartDate 
    AND ProcessStartTime < @EndDAte 
GROUP BY ApplicationHash 

/* Pulls up the actual report and inserts the count value for the ApplicationHash */ 
SELECT 
    #PCount.ProcessCount, 
    dbo.AllApps.ApplicationHash, 
    dbo.AllApps.ProcessStartTime, 
    dbo.AllApps.ApplicationType, 
    dbo.AllApps.Description, 
    dbo.AllApps.Publisher, 
    dbo.AllApps.ProductName, 
    dbo.AllApps.ProductVersion, 
    dbo.AllApps.EventDescription, 
    dbo.AllApps.CommandLine, 
    dbo.AllApps.FileName 
FROM 
    #PCount 
INNER JOIN dbo.AllApps ON dbo.AllApps.ApplicationHash = #PCount.ApplicationHash 
WHERE TokenType = 'Elevated' 
AND ApplicationType != 'COM Class' 
AND ApplicationType != 'ActiveX Control' 
AND ProcessStartTime >= @StartDate 
AND ProcessStartTime < @EndDate 
ORDER BY 
    ProcessStartTime DESC 

私は、これは2008年のバージョンでサポートされているかどうかわからないんだけど、2012年にあなたは、単にカウントにOVER句を使用して、得ることができます単一のクエリで同じ結果が表示されます。

SELECT 
    COUNT(*) OVER (PARTITION BY ApplicationHash) AS ProcessCount, 
    COUNT(*) OVER (PARTITION BY ApplicationHash, UserName) As UserCount 
    ApplicationHash, 
    ProcessStartTime, 
    ApplicationType, 
    Description, 
    Publisher, 
    ProductName, 
    ProductVersion, 
    EventDescription, 
    CommandLine, 
    FileName 
FROM dbo.AllApps 
WHERE TokenType = 'Elevated' 
AND ApplicationType != 'COM Class' 
AND ApplicationType != 'ActiveX Control' 
AND ProcessStartTime >= @StartDate 
AND ProcessStartTime < @EndDate 
ORDER BY 
    ProcessStartTime DESC 
+0

このエラーが発生しました
AlexJP

+0

どのようなエラーがありますか? –

+0

OVER句にDISTINCTを使用することはできません。 – AlexJP

関連する問題