Запросите минимальное значение за день в течение месяца - PullRequest
0 голосов
/ 04 октября 2011

У меня есть два набора данных о ценах (A и B). Набор А состоит из всех моих данных о ценах на заказ за месяц. Набор B состоит из всех данных о ценах моего конкурента за тот же месяц. Я хочу сравнить самую низкую цену моего конкурента с каждой из моих цен в день.

Графически данные выглядят так:

Дата: - Установите A: - Установите B:
1 --------- 25 --------- 31
1 --------- 54 --------- 47
1 --------- 23 --------- 56
1 --------- 12 --------- 23
1 --------- 76 --------- 40
1 --------- 42

Я хочу передать только самую низкую цену в выписку, которая оценивает, какие цены лучше. Я хотел бы обрабатывать данные за весь месяц все за один раз, поэтому в моем примере, даты с 1 по 30 (1) будут включены и сокращены все сразу, и для каждого дня будет только одно значение из набора B включено: самая низкая цена в наборе.

Важные примечания: В наборе B нет точки данных для каждой точки в наборе A

Надеюсь, это имеет смысл. Заранее благодарим за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Это странный пример, который у вас есть - у вас действительно есть цены в пределах от 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
0 голосов
/ 05 октября 2011

Я все еще не уверен, что понимаю ваши требования. Мое лучшее предположение, что вы хотите что-то вроде

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...