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

まず第一にDATE、列名を二重引用符で囲まない限り、Oracle では列に名前を付けることはできませんが、名前を付けないことをお勧めしDATEます。あらゆる種類の問題を回避できます。

列の名前が であっても Oracle は気にしませんTIMESTAMPが、それは依然として「特別な」Oracle の言葉なので、そうしないことをお勧めします。オラクルが混乱することはありませんが、あなたのコードを読んでいる人は混乱するでしょう。

my_date列の名前がandだとしましょう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

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 に答える