我无法写这个,请帮忙。下面将介绍我正在努力实现的目标。
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)
表:monthly_data
id some_date
007 08-MAY-2018
表格:daily_data some_date数据
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我处于一个更好的位置,我开始使用他提供的exists子句查询。
在性能方面,我们可以更快地编写它吗?我认为可以评估下面的东西是最快的
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)
答案 0 :(得分:1)
如果我理解正确的话。我认为这将有效。
由于您没有提供一些样本数据并且期望结果。如果没有您期望的结果,您可以提供一些样本数据并期望结果,我将编辑我的答案。
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
表
JOIN
表daily_data
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
答案 1 :(得分:0)
尝试:
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}