Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在密集排列查询期间忽略空值_Sql_Oracle - Fatal编程技术网

Sql 在密集排列查询期间忽略空值

Sql 在密集排列查询期间忽略空值,sql,oracle,Sql,Oracle,我有一张表,每一行对应于某一天某一物品的价格。 不同的行可以有同一对象不同日期的价格(它们将具有相同的对象\u id字段) 我尝试在单个查询中获取一行,其中包含每个对象的最新价格,如下所示: 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 o

我有一张表,每一行对应于某一天某一物品的价格。 不同的行可以有同一对象不同日期的价格(它们将具有相同的
对象\u id
字段) 我尝试在单个查询中获取一行,其中包含每个对象的最新价格,如下所示:

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。。。有没有办法忽略空值?我什么也找不到。 谢谢

编辑: 基本上我想做以下几点:

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

如果您使用的是10g+,则可以使用分析函数的
忽略null
子句:

这适用于9iR2(至少适用于您的数据集):


使用会避免这个问题吗,或者你真的需要忽略它们吗?我不确定我应该把null放在最后的位置。我在KEEP子句的末尾尝试过,但我认为它只会改变天数的顺序(如果其中任何一天为空),是的,比我要去的地方要好!您可以使用
选择max(last_price1)、max(last_price2)、obj_id from()组中的obj_id(按obj_id)
来获得OP显示为结果的两行。。。并不是说我可能需要告诉你…我现在没有一个数据库要测试,但是DISTINCT不会处理这个问题吗?此外,我也尝试在9.2上进行测试,但我并没有仅通过分析来实现。不,出于某种原因,测试数据返回了四行(在11gR2中进行测试);事实上,除了
7
从未出现之外,它看起来像原始测试数据。谢谢,这正是我想要的。然而,我有点担心第一个查询结果的大小(在alex poole提到的第二个查询“过滤”之前)@alex poole:我遗漏了windowing子句:)
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;
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