0

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
    );
4

4 回答 4

2

首先,Oracle 不会让你命名一个列DATE,除非你用双引号将列名括起来,但我建议不要命名它DATE——你会避免各种麻烦。

Oracle 不介意列是否被命名TIMESTAMP,但这仍然是一个“特殊”的 Oracle 词,所以我再次建议不要这样做。Oracle 不会感到困惑,但任何阅读您的代码的人都会感到困惑。

假设列名为my_dateand 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 的答案就是您可以使用的答案。

于 2013-03-29T20:53:15.387 回答
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
于 2013-03-29T20:45:25.353 回答
0

为什么不按日期排序,然后按时间排序,然后占据第一行?

于 2013-03-29T20:45:24.210 回答
0
SELECT ACCOUNTID,USERID,MAX(DATE1),MAX(TIMESTAMP) FROM tableABC
GROUP BY ACCOUNTID,USERID,DATE1;
于 2013-04-12T11:07:45.097 回答