在一个月的数据中查询每天的最小值

时间:2011-10-04 19:52:50

标签: sql oracle

我有两组定价数据(A和B)。套餐A包含一个月内每个订单的所有定价数据。 B组包含我在同一个月的所有竞争对手的定价数据。我想将竞争对手的最低价格与每天的每个价格进行比较。

从图形上看,数据如下所示:

日期: - 设置A: - 设置B:
1 --------- --------- 25 31
1 --------- --------- 54 47
1 --------- --------- 23 56
1 --------- --------- 12 23
1 --------- --------- 76 40
1 --------- 42

我希望只将最低价格传递给案例陈述,以评估哪些价格更好。我想一次处理一个月的整个数据,所以在我的例子中,日期1到30(1)将被包括在内并且同时被打破,并且对于每一天,只有一个值来自集合B包括:套装中的最低价格。

重要说明:Set B没有Set A

中每个点的数据点

希望这是有道理的。提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

这是一个奇怪的例子 - 你真的在一天之内的价格从12到76?

无论如何,将您的(分组)数据与其(分组)数据一起加入应该可以正常工作(未经测试):

with 
  my_prices as (
    select price_date, min(price_value) min_price from my_prices group by price_date),
  their_prices as (
    select price_date, min(price_value) min_price from their_prices group by price_date)
select 
  mine.price_date,
  (case 
     when theirs.min_price is null then mine.min_price
     when theirs.min_price >= mine.min_price then mine.min_price
     else theirs.min_price
   end) min_price
from
  my_min_prices mine
left join their_prices theirs on mine.price_date = theirs.price_date

答案 1 :(得分:0)

我仍然不确定我理解你的要求。我最好的猜测是你需要像

这样的东西
SQL> ed
Wrote file afiedt.buf

  1  with your_data as (
  2     select 1 date_id, 25 price_a,31 price_b from dual
  3     union all
  4     select 1, 54, 47 from dual union all
  5     select 1, 23, 56 from dual union all
  6     select 1, 12, 23 from dual union all
  7     select 1, 76, 40 from dual union all
  8     select 1, 42, null from dual)
  9  select date_id,
 10         sum( case when price_a < min_price_b
 11                   then 1
 12                   else 0
 13                end) better,
 14         sum( case when price_a = min_price_b
 15                   then 1
 16                   else 0
 17                end) tie,
 18         sum( case when price_a > min_price_b
 19                   then 1
 20                   else 0
 21                end) worse
 22    from( select date_id,
 23                 price_a,
 24                 min(price_b) over (partition by date_id) min_price_b
 25            from your_data )
 26*  group by date_id
SQL> /

   DATE_ID     BETTER        TIE      WORSE
---------- ---------- ---------- ----------
         1          1          1          4