尝试进行以下工作:
T1
:取id per dt
,其中name = A
等于most recent by load_id
- 请注意2023年1月5日的2条记录,其中load_id为2,3 =〉take load_id = 3
T2
:并显示对应的id per dt for each param
行,以及最近的load_id
- 请注意,2023年1月5日仅保留load_id = 13
T2
:如果T1
中的日期现在可用,则保持T2
行与最后已知的id
匹配
小提琴:https://dbfiddle.uk/-JO16GSj
我的SQL有点乱,能不能简化一下?
SELECT t2.dt, t2.param, t2.load_id, t2.id FROM
(SELECT
dt,
param,
load_id,
MAX(load_id) OVER (PARTITION BY dt, param) AS max_load_id,
id
FROM table2) t2
LEFT JOIN
(SELECT * FROM
(SELECT
dt,
id,
load_id,
MAX(load_id) OVER (PARTITION BY dt) AS max_load_id
FROM table1
WHERE name = 'A') t1_prep
WHERE t1_prep.load_id = t1_prep.max_load_id) t1
ON t1.dt = t2.dt and t1.id = t2.id
WHERE t2.load_id = t2.max_load_id
ORDER BY 1, 2
1条答案
按热度按时间gr8qqesn1#
您的查询可以重写为:
但是,由于
t1
中的列从不输出,而是与LEFT OUTER JOIN
连接(并且每个dt
仅输出单行),因此是否找到与t1
的匹配无关,并且可以从查询中删除该表,从而将其简化为:或使用您的查询:
其中,对于样本数据,全部输出:
| 数据传输|参数|加载ID|识别号|
| - ------|- ------|- ------|- ------|
| 2023年1月4日|无|十一|1个|
| 2023年1月4日|1个|十一|1个|
| 2023年1月5日|无|十三|三个|
| 2023年1月5日|1个|十三|三个|
| 2023年1月6日|无|十四|三个|
| 2023年1月6日|1个|十四|三个|
| 2023年1月7日|1个|十四|三个|
| 2023年1月8日|1个|十五|三个|
| 2023年1月9日|无|十六|三个|
| 2023年1月9日|1个|十六|三个|
| 2023年1月10日|无|十七|三个|
| 2023年1月10日|1个|十七|三个|
fiddle