Amazon redshift 红移优化
我正在寻找一些帮助,以优化以下。是否有一种方法可以用于消除每次调用sub select的需要,因为它们对于不同的字段几乎相同:Amazon redshift 红移优化,amazon-redshift,Amazon Redshift,我正在寻找一些帮助,以优化以下。是否有一种方法可以用于消除每次调用sub select的需要,因为它们对于不同的字段几乎相同: select IdText AS EquipmentPointCode, OnRLT AS Downtime, ( SELECT OnRLT FROM temp_pointsvr_uptime_dataset WHERE IdText = (select IDtext from list_of_ids where row
select
IdText AS EquipmentPointCode,
OnRLT AS Downtime,
( SELECT OnRLT FROM temp_pointsvr_uptime_dataset WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OnRLT > t1.OnRLT ORDER BY OnRLT ASC LIMIT 1) AS Uptime,
( SELECT LineDefault_Value1 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value1,
( SELECT LineDefault_Value2 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value2,
( SELECT LineDefault_Value3 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value3,
( SELECT LineDefault_Value4 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value4,
( SELECT LineDefault_Value5 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value5,
( SELECT LineDefault_Value6 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value6,
( SELECT LineDefault_Value7 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value7,
( SELECT StateDefault_Value1 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value1,
( SELECT StateDefault_Value2 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value2,
( SELECT StateDefault_Value3 FROM temp_not_pointsvr_downtime WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value3,
'FM 10' AS Equipment
FROM temp_pointsvr_downtime t1
WHERE IdText = (select IDtext from list_of_ids where rownum =1)
我觉得您试图做的事情可以通过case语句来完成,但是如果没有看到您正在使用的表/数据的示例,就很难确定 只要处理嵌套的select语句,您就应该能够使用一个公共表表达式一次性命中该表,而不是每次都从中重新选择:
WITH
id_text_filter AS (
SELECT IDtext
FROM list_of_ids
WHERE rownum = 1
)
SELECT
IdText AS EquipmentPointCode,
OnRLT AS Downtime,
( SELECT OnRLT FROM temp_pointsvr_uptime_dataset WHERE IdText = (select IDtext from list_of_ids where rownum =1) AND OnRLT > t1.OnRLT ORDER BY OnRLT ASC LIMIT 1) AS Uptime,
( SELECT LineDefault_Value1 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value1,
( SELECT LineDefault_Value2 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value2,
( SELECT LineDefault_Value3 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value3,
( SELECT LineDefault_Value4 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value4,
( SELECT LineDefault_Value5 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value5,
( SELECT LineDefault_Value6 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value6,
( SELECT LineDefault_Value7 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS LineDefault_Value7,
( SELECT StateDefault_Value1 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value1,
( SELECT StateDefault_Value2 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value2,
( SELECT StateDefault_Value3 FROM temp_not_pointsvr_downtime WHERE ti.IdText = f.IDtext AND OffRLT = t1.OnRLT ORDER BY ResetRLT DESC Limit 1) AS StateDefault_Value3,
'FM 10' AS Equipment
FROM temp_pointsvr_downtime t1
JOIN id_text_filter f ON ti.IDtext = f.IDtext
WHERE IdText = (SELECT IDtext FROM list_of_ids WHERE rownum =1)
同样,我不确定这段代码是否可以直接运行,因为我无法测试它。但想法应该是相似的:
1) 使用要用作筛选器的数据创建公共表表达式2) 在主选择中加入该表
3) 基于与公共表表达式的相等定义WHERE子句 天哪!你想用这句话达到什么目的?我怀疑您可以简单地使用联接,但很难理解您的查询。你能用一个简化的用例(例如没有那么多的子选项)重新写下你的问题,并描述你想要实现的目标吗?如果可能,显示表中的内容以及试图获得的输出。