交叉连接 3 列,如果在某些条件下为空,则需要消除空行

Cross joining 3 columns and need to eliminate null rows if null across certain conditions

好的,这有点难以解释,但我会尽力而为。我在 3 列上交叉连接,需要消除某些行,以便结果不会过大。我认为最好用 fiddle.

来解释

我有两个表:

ticks(dait DATE, tick INT);

votes(dayt DATE, tick INT, user INT, vote INT);

我需要在 dait, tick, user 上交叉加入他们。这是 fiddle 有用的地方。

https://www.db-fiddle.com/f/9phZ7EpRUS4FNRBZRdSYZa/29

这是我试过的最接近我的查询:

SELECT x.user, ticks.tick, dait, vote, ROW_NUMBER() OVER (ORDER BY x.user, ticks.tick, 
dait) AS ilocat
FROM ticks
CROSS JOIN (SELECT DISTINCT dayt, user, tick FROM votes) x
LEFT JOIN votes
ON votes.dayt = ticks.dait AND votes.tick = ticks.tick AND x.user = votes.user
GROUP BY dait, ticks.tick, x.user
ORDER BY x.user, ticks.tick, dait;

您可以看到 user 12 只在 2021-10-27 上对 tick 3 投了一次票。 fiddle 的输出非常接近我想要的但我需要消除行 (ilocat) 19-24,这些行显示 user 12 中对 ticks 1 and 2 的所有空票日期范围。

换句话说,如果 user 从未 tick 投票,我不想 return 那些行。但是,如果 usertick 上至少投了一次 票,那么我想 return 对应于所有日期的所有行(并显示在 user 没有投票的日子里投了空票。

我需要查看用户未投票的所有日期的原因是因为我正在执行稍后的查询以查找用户在他们投票的每个刻度上的条纹。可以想象,如果我无法消除那些不必要的行,我尝试过的查询将产生非常大的结果。

if a user has never voted on a tick, I do not want to return those rows. BUT, if a user has voted at least once on a tick, then I want to return all rows corresponding to all dates

您应该将 CROSS 连接更改为 INNER 连接:

SELECT x.user, t.tick, t.dait, v.vote, 
       ROW_NUMBER() OVER (ORDER BY x.user, t.tick, dait) AS ilocat
FROM ticks t
INNER JOIN (SELECT DISTINCT dayt, user, tick FROM votes) x
ON t.tick = x.tick
LEFT JOIN votes v
ON v.dayt = t.dait AND v.tick = t.tick AND x.user = v.user
GROUP BY dait, t.tick, x.user
ORDER BY x.user, t.tick, t.dait;

参见demo