6

みんな、基本的にユーザーが使用した最新のブラウザーを選択するクエリがあります。

これが(簡略化された)テーブル構造です

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 を追加した後に Web サイトにアクセスしたユーザーの結果であり、他のユーザーは除外されます。

サンプルケースはこちら

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'

私の質問が明確であることを願っています。

4

3 に答える 3

7

hits_table に対して userid で group by を使用すると、各 userid の max() hitsdate を取得できます。以下のコードでは、これを LATEST HITS と呼んでいます。

LATEST HITS への左結合で USER TABLE を選択すると、すべてのユーザーのレコードを取得できます。

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
于 2009-08-16T09:42:01.110 に答える
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
于 2009-08-16T08:45:09.293 に答える
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
于 2009-08-16T09:02:27.257 に答える