临时表上的SQL JOIN减少行数

时间:2015-02-04 17:05:29

标签: sql postgresql amazon-redshift

我在Amazon Redshift中设置了一个表(原始),为每个唯一数据点的唯一ID(VID)和时间戳(时间戳)编制索引。每种类型的数据还具有与之关联的模式(模式),值(val)和数据点id(PID)。

Timestamp, VID,  PID, VAL, MODE
0001,      V001, P01,   0, DRIVE
0002,      V001, P02,   1, DRIVE

我创建了一个临时表(_tmp),其中包含数据中某些事件的“开始”和“结束”句点。

MODE, Start,  End, Duration, VID
DRIVE, 0001, 0002,       1,  V001

临时表的存在与我的问题无关。我关心的不是查询时间,而是关于行计数。

临时表中有150行。我试图获取特定PID的原始数据中唯一时间戳的数量,其值为0 - 在临时表的每一行的“开始”和“结束”内。

基本上 -

SELECT count(DISTINCT "r"."timestamp"), "t"."start"
FROM _tmp t
JOIN raw r ON "r"."timestamp" between "t"."start" and "t"."end"
WHERE "r"."pid" = 'P01' AND "r"."VAL" = 0
GROUP BY "t"."start"

我面临的问题是,由于(我假设)'raw'表中缺少数据,我得到的行数为~50而不是我需要的_tmp表中的150。空值很好,但减少的行不是。我尝试过不同类型的连接 - 问题似乎是我正在寻找的'PID'在原始数据的某些时间范围内不存在。

1 个答案:

答案 0 :(得分:0)

你可能是正确的,“where”条款没有帮助。我认为您需要(a)LEFT联接以在过滤器之前保留_tmp中的所有记录,并且需要修改的WHERE子句以包含不匹配(将从这些字段提供NULL值)。

count()只计算非空值,因此它应该没问题。

SELECT count(DISTINCT "r"."timestamp"), "t"."start"
FROM _tmp t
LEFT JOIN raw r ON "r"."timestamp" between "t"."start" and "t"."end"
WHERE ( "r"."pid" = 'P01' AND "r"."VAL" = 0 ) OR ("r"."pid" IS NULL AND "r"."VAL" IS NULL)
GROUP BY "t"."start"