簡體   English   中英

通過另一列SQL中的唯一條目對列進行分組

[英]Group column by unique entries in another column SQL

我有以下數據集

在此處輸入圖片說明

我想查詢數據以生成每個用戶名的唯一主機名列表,其中還包含該記錄的最后登錄時間。 例如,產生以下數據集。

在此處輸入圖片說明

目的是檢測用戶帳戶共享,以及具有異常大量主機名的用戶。

我知道有足夠多的SQL會給自己帶來麻煩,但是我只是寫的查詢不夠頻繁,以至於不能熟練地編寫此查詢而不會花半天時間。 有人可以協助嗎?

我們正在使用Azure SQL(SQL Server),但是我可以翻譯其他SQL語言的答案。

謝謝

更新

我已經使用以下

select username, hostname, max(logintimeutc)
from loginrecords
group by username, hostname

這將返回一個良好的數據集,但是,盡管上面的查詢顯示了針對同一主機名的多個用戶名,但當我嘗試以下操作時,它仍返回0條記錄

select username, hostname, max(logintimeutc)
from loginrecords
group by username, hostname
having count(distinct(hostname)) > 1

我想查詢數據以生成每個用戶名的唯一主機名列表,其中還包含該記錄的最后登錄時間。

我認為您只想group by以下方式group by

select username, hostname, max(logintimeutc)
from t
group by username, hostname;

您可以為此使用row_number()。

select * from table1 t1
inner join
    (select row_number() over (partition by HostName, UserName order by LoginTimeUTC desc) as rn, UserName
            ,LoginTimeUTC, HostName from table1) as t2
on t2.UserName = t1.UserName and t2.LoginTimeUTC = t2.LoginTimeUTC and t2.HostName = t1.HostName
where t2.rn = 1

如果我理解正確,不考慮登錄時間就可以得到2個結果,請嘗試以下查詢:

select username,hostname,
count(*) over (partition by hostname) as NUMBER_OF_USERS_FOR_THIS_HOST,
count(*) over (partition by username) as NUMBER_OF_HOSTS_FOR_THIS_USER
from loginrecords
group by username, hostname;

首先,我使用以下查詢創建了一個測試環境。 如果您自己在以后的問題中提供這些(或文本表格數據),那將是很好的。 帶有數據的屏幕截圖對於測試目的非常不友好。

CREATE TABLE [LoginRecords] (
    [LoginTimeUTC] SMALLDATETIME,
    [UserName] VARCHAR(5),
    [HostName] VARCHAR(5)
);
GO

INSERT INTO [LoginRecords] VALUES
    ('2019-08-22T09:51:00', 'user1', 'host1'),
    ('2019-08-25T09:31:00', 'user1', 'host2'),
    ('2019-08-30T10:51:00', 'user1', 'host2'),
    ('2019-08-25T09:51:00', 'user2', 'host2'),
    ('2019-08-25T05:51:00', 'user2', 'host3'),
    ('2019-08-30T09:51:00', 'user2', 'host3'),
    ('2019-08-25T09:31:00', 'user3', 'host4'),
    ('2019-08-30T10:51:00', 'user3', 'host4'),
    ('2019-08-25T09:51:00', 'user3', 'host4'),
    ('2019-08-25T05:51:00', 'user3', 'host5'),
    ('2019-08-25T09:51:00', 'user4', 'host6'),
    ('2019-08-25T09:31:00', 'user4', 'host6'),
    ('2019-08-30T10:51:00', 'user4', 'host6'),
    ('2019-08-25T09:51:00', 'user4', 'host7'),
    ('2019-08-30T05:51:00', 'user4', 'host7');
GO

SELECT [LoginTimeUTC], [UserName], [HostName]
FROM [LoginRecords];

現在到您的實際問題。 我正在考慮您的最后一個查詢,該查詢未返回您想要的結果:

select username, hostname, max(logintimeutc)
from loginrecords
group by username, hostname
having count(distinct(hostname)) > 1

除了HAVING子句,您還可以添加WHERE子句以僅過濾與多個主機名一起使用的用戶名。

select username, hostname, max(logintimeutc)
from loginrecords
where username in (select username
                   from loginrecords
                   group by username
                   having count(distinct hostname) > 1)
group by username, hostname

得到以下結果:

username      hostname      (No column name)
user1         host1         22/08/2019 9:51
user1         host2         30/08/2019 10:51
user2         host2         25/08/2019 9:51
user2         host3         30/08/2019 9:51
user3         host4         30/08/2019 10:51
user3         host5         25/08/2019 5:51
user4         host6         30/08/2019 10:51
user4         host7         30/08/2019 5:51

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM