伙计们,我有一个查询,基本上选择我们用户使用的最新浏览器。
这是我们的(简化)表格结构
HITS_TABLE
----------
USERID
BROWSER
HITSDATE
USER_TABLE
----------
USERID
USERNAME
以下是我如何查询用户使用的最新浏览器
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
几天前刚刚添加了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'
以下是示例结果
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
但是,我想添加其他用户使用'未知'浏览器。 这是我想要的结果
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
3 'Dixon' 'Unknown'
我相信它可以通过LEFT OUTER JOIN来实现。 但我总是这样:(我不想要这个结果)
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome'
2 'Atwoord' 'Firefox 3.5'
3 'Dixon' 'Unknown'
我希望我的问题很明确。
答案 0 :(得分:7)
在hid_table上使用on userid上的group by允许你获得每个userid的max()hitsdate。我在下面的代码中称这个最新的命中。
在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
答案 1 :(得分:3)
你不能选择,不漂亮,但应该工作..
SELECT U.*,
ISNULL((SELECT TOP 1 BROWSER
FROM HITS_TABLE
WHERE HITS_TABLE.USERID = U.USERID
ORDER BY HITS_TABLE.HITSDATE DESC),'UnKnown') AS Browser
FROM USER_TABLE U
答案 2 :(得分:0)
SELECT U.*,'BROWSER' =
case
when (SELECT TOP 1 BROWSER FROM HITS_TABLE WHERE HITS_TABLE.USERID = U.USERID ORDER BY HITS_TABLE.HITSDATE DESC) is null then 'Unknown'
else (SELECT TOP 1 BROWSER FROM HITS_TABLE WHERE HITS_TABLE.USERID = U.USERID ORDER BY HITS_TABLE.HITSDATE DESC)
end
FROM USER_TABLE U