1

私はSQLに慣れていないので、これを行う必要があります.sec_users_tableという名前のテーブルがあります。次のようになります。

id      ip      user_id      to_dt
--------------------------------------------------
1       1        1           26-Apr-12 2:14:02 PM
2       1        1           30-Apr-12 8:48:49 PM
3       1        1           02-May-12 6:17:22 PM
4       2        5           05-May-12 6:18:10 PM
5       2        5           04-May-12 6:17:57 PM
6       3        8           07-May-12 1:32:34 PM
7       3        8           09-May-12 5:09:54 PM
8       4        10          10-May-12 4:40:42 PM
9       5        12          11-May-12 6:10:29 PM

最新の日付で一意のペア (ip、user_id) を選択したいのですが、id と ip の列だけを返します。この例の結果は次のようになります。

id      ip
-----------
3       1  
4       2 
7       3  
8       4  
9       5 

Oracle pl/sql を使用しています。

ありがとうございました。

4

3 に答える 3

3

次のステートメントを実行してみてください。アイデアは、ip と user_id でランクを使用し、日付で並べ替えることです。

SELECT id, ip
FROM (
  SELECT id as id,
         ip as ip,
  rank() OVER (PARTITION BY ip, user_id ORDER BY to_dt DESC) as rk
  FROM sec_users_table
)
WHERE rk = 1;

SQLfiddle の例

于 2012-09-30T08:35:12.590 に答える
1

次のようなものを見てください

SELECT s.id,
      s.ip
FROM sec_users_table s INNER JOIN
(
  SELECT ip,
          user_id,
          MAX(to_dt) last_date
  FROM sec_users_table
  GROUP BY ip,
          user_id
 ) m ON s.ip = m.ip
     and s.user_id = m.user_id
     and s.to_dt = m.last_date
ORDER BY 1, 2

SQL フィドルのデモ

于 2012-09-30T08:42:29.917 に答える
0

特定のユーザーの最新の行を取得するには:

SELECT id, ip
  FROM sec_users_table t
 WHERE to_dt = ( SELECT MAX(to_dt)
                   FROM sec_users_table t2
                  WHERE t2.user_id = t.user_id )
   AND user_id = :user

にインデックスを付けるとパフォーマンスが向上しますuser_id

2 つの同じ日付が存在するリスクがあり、SQL が 1 つの行のみを返すことを確認したい場合は、AND ROWNMUN = 1.

于 2012-09-30T21:54:04.783 に答える