高级选择清晰

时间:2012-09-30 08:17:47

标签: sql oracle plsql

我是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。

谢谢。

3 个答案:

答案 0 :(得分: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 example

答案 1 :(得分: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 Fiddle DEMO

答案 2 :(得分: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