我是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。
谢谢。
答案 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;
答案 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
答案 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
。