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.

如果存在两个相同日期的风险,并且您希望确保 SQL 仅返回单行,则可能需要添加AND ROWNMUN = 1.

于 2012-09-30T21:54:04.783 回答