サイトにアクティビティログテーブルがあります。ログインごとに、日付/時刻、ユーザーID、およびIPアドレスの列があります。
一意のユーザー名と、それらがログインした最新のIPアドレスのリストを取得したい。
SQL Serverでt-sqlを使用してテーブルからこれを取得するための最良の方法は何ですか?
サイトにアクティビティログテーブルがあります。ログインごとに、日付/時刻、ユーザーID、およびIPアドレスの列があります。
一意のユーザー名と、それらがログインした最新のIPアドレスのリストを取得したい。
SQL Serverでt-sqlを使用してテーブルからこれを取得するための最良の方法は何ですか?
移植可能なアプローチは次のとおりです。
select l.userID, l.Date, l.IpAddress
from (
select userID, max(Date) as MaxDate
from Log
group by userID
) lm
inner join Log l on lm.userID = l.userID
and lm.MaxDate = l.Date
SQL Server 2005 以降を使用している場合は、次のこともできます。
select * from
(
select userID, Date, IpAddress,
Rank() over (Partition BY userID order by Date DESC) as Rank
from Log
) tmp
where Rank = 1
ここでいくつかの列/テーブル名を推測しています.ユーザー名はテーブルからのものであると想定しています(そして、ユーザー名を毎回ログに保存していません):
;WITH x AS
(
SELECT userID, IPaddress, rn = ROW_NUMBER() OVER
(PARTITION BY UserID ORDER BY datetimecolumn DESC)
FROM dbo.LogTable
)
SELECT u.username, x.IPAddress
FROM x INNER JOIN dbo.Users AS u
ON u.userID = x.userID
WHERE x.rn = 1;
select distinct(user_name), (select top 1 IP_address from log_table where user_name=LOG.user_name order by log_date desc)
from log_table LOG