ホームページ >データベース >mysql チュートリアル >Oracle でタイムスタンプに基づいて各グループの最新の値を取得する方法

Oracle でタイムスタンプに基づいて各グループの最新の値を取得する方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-21 15:36:10894ブラウズ

How to Retrieve the Latest Value for Each Group Based on Timestamp in Oracle?

時間に基づいて各グループの最新の値を取得します

質問:

次の Oracle テーブルについて考えてみましょう:

<code>id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
1      2010-01-04 10:45  132
2      2010-01-04 10:45  318
4      2010-01-04 10:45  122
1      2010-01-04 10:30  1
3      2010-01-04 10:30  214
2      2010-01-04 10:30  5515
4      2010-01-04 10:30  210</code>

目標は、ID グループごとに最新の値 (およびそのタイムスタンプ) を取得することです。予期される出力は次のようになります:

<code>id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
3      2010-01-04 10:30  214
4      2010-01-04 10:45  122</code>

解決策:

これを行うには、タイムスタンプの降順に基づいて ID グループ内の各行をランク付けするインライン ビューを作成します。

<code class="language-sql">SELECT RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk,
       id, ts, qty
FROM qtys</code>

次に、ランク 1 のレコードをフィルターして最新の値を取得します。

<code class="language-sql">SELECT x.id, x.ts AS "DATE", x.qty AS "QUANTITY"
FROM (SELECT * FROM qtys) x
WHERE x.rnk = 1</code>

詳細オプション:

  • 時間によるフィルター: 過去 XX 分以内の値のみを取得するには、次の条件を WHERE 句に追加します:
<code class="language-sql">WHERE x.ts >= sysdate - INTERVAL 'XX' MINUTE</code>
  • id を別のテーブルのデータと結合します: idname 列が別のテーブルに存在する場合、それらのテーブルを結合して値を結合します:
<code class="language-sql">SELECT x.id || '-' || y.idname AS "ID",
       x.ts AS "DATE", x.qty AS "QUANTITY"
FROM (SELECT * FROM qtys) x
LEFT JOIN another_table y ON x.id = y.id</code>

以上がOracle でタイムスタンプに基づいて各グループの最新の値を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。