Использование глобальной временной таблицы в подзапросе дает NULL - PullRequest
0 голосов
/ 01 ноября 2018

Я использую следующий запрос.

SELECT  SYSDATE,(SELECT P_PRICE_OPEN FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID='P8R3C2-R' AND P_DATE='22-OCT-18' AND P_VOLUME<>0 AND ROWNUM=1) FROM DUAL;

GTT_ADJ_PRICE_TABLE - глобальная временная таблица, загруженная значениями, когда я выполнил связанную с ней функцию. Этот GTT сохраняет строки после коммита. Этот запрос дает мне правильные результаты.

Но, если я выполню запрос

SELECT WEEK_END, WEEK_START, 
        (SELECT P_PRICE_OPEN FROM GTT_ADJ_PRICE_TABLE WHERE P_DATE=WEEK_START) AS WEEKS_OPEN_PRICE,
        (SELECT MAX(P_PRICE_HIGH) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_HIGH,
         (SELECT MIN(P_PRICE_LOW) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_LOW,
        (SELECT SUM(P_VOLUME) FROM GTT_ADJ_PRICE_TABLE WHERE FSYM_ID=FID AND P_DATE<=WEEK_END 
                AND P_DATE>=WEEK_START AND P_VOLUME<>0) AS WEEKLY_VOLUME,
        P_PRICE 
FROM (
       SELECT ROWNUM,FID,WEEK_END,P_VOLUME,P_PRICE,
                 (SELECT P_DATE FROM FP_V2_FP_BASIC_PRICES WHERE FSYM_ID=FID AND P_DATE>=TRUNC(WEEK_END, 'IW') AND P_VOLUME<>0 AND ROWNUM=1) AS WEEK_START
       FROM (
              SELECT 
                    ROWNUM,FSYM_ID AS FID, WEEK_END,P_VOLUME, P_PRICE,P_PRICE_OPEN,P_PRICE_HIGH,P_PRICE_LOW
              FROM (
                     SELECT ROWNUM,FSYM_ID,P_DATE AS WEEK_END, P_PRICE,P_VOLUME, P_PRICE_OPEN,P_PRICE_HIGH,P_PRICE_LOW,
                            CASE 
                                 WHEN (TO_CHAR(P_DATE,'D') >= AVG(TO_CHAR(P_DATE,'D')) OVER (order by P_DATE DESC rows between 1 preceding and current row) and ROWNUM>=1)  or TO_CHAR(P_DATE,'D')=6
                                 THEN 1
                                 ELSE 0
                            END AS WEEKFLAG
                     FROM(
                           SELECT * FROM TABLE (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0
                         ) 
                    )WHERE WEEKFLAG=1
             )
      );

Это дает мне NULL в WEEKS_OPEN_PRICE, WEEKLY_HIGH, WEEKLY_LOW, WEEKLY_VOLUME. Пожалуйста, помогите мне решить проблему. Спасибо в ожидании.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Попробуйте с WITH предложением. Я надеюсь, что приведенный ниже запрос работает. У меня нет возможности проверить.

WITH adjustedPrice AS (
   SELECT *
     FROM TABLE(adjusted_price('P8R3C2-R'))
    WHERE p_volume <> 0
      AND TO_CHAR(p_date, 'DY') NOT IN ('SAT', 'SUN') 
)
SELECT ap.week,
       ap.week_start,
       ap.week_end,
       ap.weeks_high_price,
       ap.weeks_low_price,
       ap.weekly_volume,
       ws.p_price_open AS weeks_open_price,
       we.p_price      AS weeks_close_price
  FROM (
         SELECT TRUNC(p_date, 'IW') AS week,
                TRUNC(MIN(p_date))  AS week_start,
                TRUNC(MAX(p_date))  AS week_end,
                MAX(p_price_high)   AS weeks_high_price,
                MIN(p_price_low)    AS weeks_low_price,
                SUM(p_volume)       AS weekly_volume
           FROM adjustedPrice
          GROUP BY TRUNC(p_date, 'IW')
        ) ap
 INNER JOIN adjustedPrice ws ON ws.p_date = ap.week_start 
 INNER JOIN adjustedPrice we ON we.p_date = ap.week_end
ORDER BY week DESC;
0 голосов
/ 05 декабря 2018

Хотел опубликовать как комментарий. Но это не подходит, поэтому пишу это как ответ.

Я попробовал этот код, чтобы получить начало, конец недели, высокую цену недели, низкую цену недели, недельный объем.

              select
                        trunc("P_DATE", 'IW') as week,
                        min(trunc("P_DATE")) as week_start,
                        max(trunc("P_DATE")) as week_end,
                        MAX(P_PRICE_HIGH) AS WEEKS_HIGH_PRICE,
                        MIN(P_PRICE_LOW) AS WEEKS_LOW_PRICE,
                        SUM(P_VOLUME) AS WEEKLY_VOLUME
            from TABLE 
                        (ADJUSTED_PRICE('P8R3C2-R')) 
            WHERE 
                        P_VOLUME<>0 AND to_char("P_DATE", 'DY') not in ('SAT','SUN')
            group by 
                        trunc("P_DATE", 'IW')
            ORDER BY 
                        trunc("P_DATE", 'IW') DESC;

Это дало мне результаты всего за 2-4 секунды. Но я хочу получить цену открытия недель, когда дата будет равна WEEK_START, и цену закрытия недель, где дата будет равна WEEK_END.

Я попробовал следующий подход для того же. Но это занимает слишком много времени (например, 300+ секунд).

SELECT 
        WEEK,WEEK_START, WEEK_END, WEEKS_HIGH_PRICE,WEEKS_LOW_PRICE,WEEKLY_VOLUME,
        (SELECT P_PRICE_OPEN FROM TABLE  (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0 AND P_DATE=WEEK_START) AS WEEKS_OPEN_PRICE,
        (SELECT P_PRICE FROM TABLE  (ADJUSTED_PRICE('P8R3C2-R')) WHERE P_VOLUME<>0 AND P_DATE=WEEK_END) AS WEEKS_CLOSE_PRICE
FROM
        (
            select
                        trunc("P_DATE", 'IW') as week,
                        min(trunc("P_DATE")) as week_start,
                        max(trunc("P_DATE")) as week_end,
                        MAX(P_PRICE_HIGH) AS WEEKS_HIGH_PRICE,
                        MIN(P_PRICE_LOW) AS WEEKS_LOW_PRICE,
                        SUM(P_VOLUME) AS WEEKLY_VOLUME
            from TABLE 
                        (ADJUSTED_PRICE('P8R3C2-R')) 
            WHERE 
                        P_VOLUME<>0 AND to_char("P_DATE", 'DY') not in ('SAT','SUN')
            group by 
                        trunc("P_DATE", 'IW')
            ORDER BY 
                        trunc("P_DATE", 'IW') DESC
        );

Если кто-то может помочь мне улучшить время вывода, то очень приветствуется.

...