Amazon redshift 红移优化

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

我正在寻找一些帮助,以优化以下。是否有一种方法可以用于消除每次调用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 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子句

天哪!你想用这句话达到什么目的?我怀疑您可以简单地使用联接,但很难理解您的查询。你能用一个简化的用例(例如没有那么多的子选项)重新写下你的问题,并描述你想要实现的目标吗?如果可能,显示表中的内容以及试图获得的输出。