tableABC 具有单独的日期和时间列:
+-----------+--------+-----------+-----------+
| AccountID | userID | date | timestamp |
+-----------+--------+-----------+-----------+
| 123 | 1 | 29-MAR-13 | 21005 |
| 123 | 1 | 29-MAR-13 | 11005 |
| 123 | 1 | 23-MAR-13 | 21005 |
+-----------+--------+-----------+-----------+
我需要最大日期列和时间戳列。我写的查询只做日期的最大值而不是时间戳:
select *
from tableABC rn
where userID = '1'
and accountID = '123'
and date =
(
select max(date) MaxDate
from tableABC b
where b.userID = rn.userID
and b.accountID = rn.accountID
);
答案 0 :(得分:2)
首先,Oracle不允许您为列DATE
命名,除非您用双引号括起列名,但我建议您不要命名DATE
- 您将避免各种麻烦。
Oracle并不介意列是否被命名为TIMESTAMP
,但这仍然是一个“特殊”的Oracle词,所以我建议不要这样做。 Oracle不会感到困惑,但任何人都会阅读您的代码。
假设列名为my_date
和my_timestamp
。要查询所有用户的最高日期/时间戳,请执行以下操作:
SELECT * FROM (
SELECT
AccountID,
userID,
my_date,
my_timestamp,
ROW_NUMBER() OVER (
PARTITION BY AccountID, UserID
ORDER BY my_date DESC, my_timestamp DESC) AS DateTimestampRank
FROM TableABC
) WHERE DateTimeStampRank = 1
如果您只想查询一个用户,请使用@GordonLinoff的答案。
答案 1 :(得分:1)
只需使用order by
:
select *
from (select *
from tableABC
order by "date" desc, "timestamp" desc
) t
where rownum = 1
如果您尝试获取每个accountID / userID组合的最大值,请使用row_number()
:
select *
from (select *, row_number() over (partition by userId, accountId order by "date" desc, "timestamp" desc) as seqnum
from tableABC
) t
where seqnum = 1
答案 2 :(得分:0)
为什么不按日期排序,然后按时间排序,然后排在前排?
答案 3 :(得分:0)
SELECT ACCOUNTID,USERID,MAX(DATE1),MAX(TIMESTAMP) FROM tableABC
GROUP BY ACCOUNTID,USERID,DATE1;