获取最多两列(一列存储日期,其他存储时间)

时间:2013-03-29 20:37:54

标签: sql oracle subquery max

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 个答案:

答案 0 :(得分:2)

首先,Oracle不允许您为列DATE命名,除非您用双引号括起列名,但我建议您不要命名DATE - 您将避免各种麻烦。

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

假设列名为my_datemy_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;
相关问题