1

各行が特定の日のオブジェクトの価格に対応するテーブルがあります。異なる行には、同じオブジェクトの異なる日の価格を設定できます (object_idsフィールドは同じです)。次のように、各オブジェクトの最新の価格を含む行を 1 つのクエリで取得しようとしています。

SELECT
   MAX(price1) KEEP (DENSE_RANK FIRST
ORDER BY day DESC),
MAX(price2) KEEP (DENSE_RANK FIRST
ORDER BY day DESC)

FROM historic_prices H3
GROUP BY object_ids;

残念ながら、最新の価格が NULL の場合、これは機能せず、NULL を返すだけです... null 値を無視する方法はありますか? 何も見つかりませんでした。ありがとう

編集:基本的に私は次のことをしたい:

table:

col 1 | col 2 | obj_id | date
----------------------------
null  | null  |   1    |  100
----------------------------
5     | null  |   1    |  90
---------------------------
3     | null  |   0    |  80
-----------------------------
7     |  4    |   1    |  70


result : 

col 1 | col 2 | obj_id |
-------------------------
5     | 4     | 1
---------------------
3     | null  | 0
4

1 に答える 1

3

10g+ を使用しているIGNORE NULLS場合は、分析関数の句を使用できFIRST_VALUEます。

SELECT DISTINCT 
       object_ids, 
       FIRST_VALUE(price1 IGNORE NULLS)
          OVER (PARTITION BY obj_id ORDER BY DAY DESC
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) p1, 
       FIRST_VALUE(price2 IGNORE NULLS) 
          OVER (PARTITION BY obj_id ORDER BY DAY DESC
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) p2
  FROM historic_prices;

これは 9iR2 で動作します (少なくともデータセットでは):

SQL> WITH DATA AS (
  2     SELECT NULL col1, NULL col2, 1 obj_id, 100 DAY FROM dual
  3     UNION ALL SELECT 5, NULL, 1, 90 FROM dual
  4     UNION ALL SELECT 3, NULL, 0, 80 FROM dual
  5     UNION ALL SELECT 7, 4, 1, 70 FROM dual
  6  )
  7  SELECT obj_id,
  8         MAX(col1)
  9            KEEP (DENSE_RANK FIRST ORDER BY DECODE(col1, NULL, 1, 0),
 10                                            DAY DESC) last_price1,
 11         MAX(col2)
 12            KEEP (DENSE_RANK FIRST ORDER BY DECODE(col2, NULL, 1, 0),
 13                                            DAY DESC) last_price2
 14    FROM DATA
 15   GROUP BY obj_id;

    OBJ_ID LAST_PRICE1 LAST_PRICE2
---------- ----------- -----------
         0           3 
         1           5           4
于 2012-05-14T15:52:16.480 に答える