Как использовать max в предложении with, чтобы получить одно значение и использовать это значение в основном запросе с проверкой нуля - PullRequest
0 голосов
/ 09 мая 2018

Я не могу написать это, пожалуйста, помогите. Ниже будет дано представление о том, чего я пытаюсь достичь.

WITH monthly_data AS
  (SELECT MAX(some_date) latest_dt FROM monthly_data
  )
SELECT SUM(data)
FROM daily_data
WHERE (monthly_data.latest_dt IS NULL
OR daily_data.some_date      > monthly_data.latest_dt)

таблица: месячные_данные

id     some_date
007    08-MAY-2018

таблица: daily_data данные некоторых дат

07-MAY-2018     1
08-MAY-2018     1
09-MAY-2018     1

Ожидаемый результат

Case 1: 1 row exist in table monthly_data.
Query should return 1.

Case 2: No rows exist in table montly_data.
Query should return 3.

Соединения в приведенном выше запросе некорректны, но в основном написаны, чтобы дать вам представление о том, что я пытаюсь сделать. Кроме того, когда я говорю, что в таблице month_data нет строк, это упрощенное объяснение. В текущем запросе есть другие условия, которые отфильтровывают данные.

Это должно пройти процедуру

Редактировать Благодаря @ D-Shih я нахожусь в гораздо лучшем положении, где я начал с использования запроса существующего предложения, который он предоставил.

С точки зрения производительности, можем ли мы написать это быстрее? Я думаю, что что-то, что можно оценить ниже, будет самым быстрым

WITH CTE AS
  ( SELECT MAX(some_date) latest_dt FROM monthly_data
  )
SELECT SUM(d.some_data)
FROM daily_data d
WHERE (d.some_date > '08-MAY-2018'
OR '08-MAY-2018'  IS NULL)

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

ПОПРОБУЙТЕ :

SELECT CASE WHEN SUM(CASE WHEN md.Sdate IS NOT NULL THEN 1 ELSE 0 END) > 0 THEN 
            SUM(CASE WHEN md.Sdate IS NOT NULL THEN 1 ELSE 0 END)
        ELSE 
            SUM(CASE WHEN md.Sdate IS NULL THEN 1 ELSE 0 END) 
        END cnt
FROM daily_data dd
LEFT JOIN monthly_data md ON md.Sdate = dd.Sdate
....... {other conditions}
0 голосов
/ 09 мая 2018

Если я правильно понимаю. Я думаю, что это будет работать.

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

WITH CTE AS (
    SELECT Max(some_date) latest_dt 
    FROM   monthly_data
) 
SELECT Sum(d.data) 
FROM   daily_data d
WHERE Exists (
    SELECT 1 
    FROM CTE c
    WHERE  
        d.some_date > c.latest_dt 
    OR 
        c.latest_dt IS NULL 
)

Редактировать

Вы можете попробовать использовать CTE table JOIN on daily_data table

WITH CTE AS (
    SELECT Max(some_date) latest_dt 
    FROM   monthly_data
) 
SELECT SUM(d.data)
FROM CTE c JOIN  daily_data d
ON  d.some_date > c.latest_dt OR c.latest_dt IS NULL;

sqlfiddle: http://sqlfiddle.com/#!4/33c64e/28

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