Anw*_*dra 6 sql-server-2005 outer-join
大家好,我有一个查询,基本上选择我们用户使用的最新浏览器.
这是我们的(简化)表结构
HITS_TABLE
----------
USERID
BROWSER
HITSDATE
USER_TABLE
----------
USERID
USERNAME
Run Code Online (Sandbox Code Playgroud)
这是我如何查询用户使用的最新浏览器
SELECT U.*, H.BROWSER
FROM USER_TABLE U
CROSS APPLY
(SELECT TOP 1 BROWSER
FROM HITS_TABLE
WHERE HITS_TABLE.USERID = U.USERID
ORDER BY HITS_TABLE.HITSDATE DESC
)as H
Run Code Online (Sandbox Code Playgroud)
几天前刚刚添加了HITS_TABLE.
因此,该查询只是在我们添加HITS_TABLE后访问我们网站的结果,并消除了其他用户.
以下是示例案例
USER_TABLE
-------------------
USERID USERNAME
-------------------
1 'Spolski'
2 'Atwoord
3 'Dixon'
HITS_TABLE
------------------------------
USERID HITSDATE BROWSER
------------------------------
2 15/8/2009 'Firefox 3.5'
1 16/8/2009 'IE 6'
2 16/8/2009 'Chrome'
Run Code Online (Sandbox Code Playgroud)
这是样本结果
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
Run Code Online (Sandbox Code Playgroud)
但是,我想添加其他用户使用'未知'浏览器.这是我想要的结果
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
3 'Dixon' 'Unknown'
Run Code Online (Sandbox Code Playgroud)
我相信它可以通过LEFT OUTER JOIN来实现.但我总是这样:(我不想要这个结果)
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
2 'Atwoord' 'Firefox 3.5'
3 'Dixon' 'Unknown'
Run Code Online (Sandbox Code Playgroud)
我希望我的问题很明确.
在on userid上使用group by对hits_table允许你获得每个userid的max()hitsdate.我在下面的代码中称这个最新的HITS.
在USER TABLE上选择左连接到LATEST HITS允许您为每个用户提取记录.
加入HITS TABLE然后全部用来拉取与该日期相关联的浏览器记录,或者为那些没有记录的用户提供null.
select
user_table.userid,
user_table.username,
isnull(hitstable.browser, 'unknown') as browser
from
user_table
left join
(
select
userid,
max(hitsdate) hitsdate
from
hits_table
group by
userid
) latest_hits
on
user_table.userid = latest_hits.userid
left join
hits_table
on hits.table.userid = latest_hits.userid
and hits_table.hitsdate = latest_hits.hitsdate
Run Code Online (Sandbox Code Playgroud)