Запрос на получение данных - PullRequest
1 голос
/ 01 февраля 2011

Я новичок в SQL, и мне нужно написать запрос, который кажется сложным.Мне нужно написать запрос для получения возврата из таблицы, которая выглядит следующим образом:

 id    Price_date    price   
 1     1-1-2010     20    
 1     2-2-2010     21    
 1     7-2-2010     22    
 1     27-2-2010    23    
 1     3-3-2010     23   

Вот что мне нужно выбрать из приведенной выше таблицы: -

  • id,
  • цена_даты (дата последней цены месяца),
  • возврат ((last_price_of_month / last_price_of_previous_month) -1),
  • last_date_for_return_calculation (первый день следующего месяца)

И пример данных будет выглядеть так: -

    id      price_date   return        last_date_for_return_calculation    
    1       27-2-2010    (23/20 -1)    1-3-2011     

Может ли кто-нибудь помочь мне в решении этой проблемы?

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

в зависимости от ваших требований, похоже, ваша дата в 2011 году, а не в 2010 году. Также в январе я добавил строку, чтобы быть уверенным, что последняя строка предыдущего месяца содержит данные выборки.

SQL> WITH DATA AS (
  2  SELECT 1 id, to_date('1-1-2011', 'dd-mm-yyyy') Price_date, 19.5 price
  3    FROM DUAL
  4  UNION ALL SELECT 1, to_date('31-1-2011', 'dd-mm-yyyy'), 20 FROM DUAL
  5  UNION ALL SELECT 1, to_date('2-2-2011', 'dd-mm-yyyy'), 21 FROM DUAL
  6  UNION ALL SELECT 1, to_date('7-2-2011', 'dd-mm-yyyy'), 22 FROM DUAL
  7  UNION ALL SELECT 1, to_date('27-2-2011', 'dd-mm-yyyy'), 23 FROM DUAL
  8  UNION ALL SELECT 1, to_date('3-3-2011', 'dd-mm-yyyy'), 23 FROM DUAL
  9  )
 10  SELECT ID,
 11         MAX(price_date) price_date,
 12         MAX(price) KEEP (DENSE_RANK FIRST ORDER BY price_date DESC)
 13         / MAX(price)
 14           KEEP (DENSE_RANK FIRST
 15                 ORDER BY CASE WHEN price_date < trunc(SYSDATE, 'month')
 16                               THEN price_date END
 17                 DESC NULLS LAST) - 1 RETURN,
 18         add_months(trunc(SYSDATE, 'month'), 1) last_date_for_return_calc
 19    FROM DATA
 20   WHERE price_date >= add_months(trunc(SYSDATE, 'month'), -1)
 21     AND price_date < add_months(trunc(SYSDATE, 'month'), 1)
 22   GROUP BY ID;

        ID PRICE_DATE      RETURN LAST_DATE_FOR_RETURN_CALC
---------- ----------- ---------- -------------------------
         1 27/02/2011        0,15 01/03/2011
0 голосов
/ 01 февраля 2011

Возможно с запросом.

Но вам, вероятно, лучше, если вы просто запросите такую ​​таблицу и отфильтруете ее на стороне вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...