好吧,這有點難以解釋,但我會在這里盡力而為。我在 3 列上交叉加入,需要消除某些行,以便結果不會過大。我認為最好用小提琴來解釋。
我有兩個表:
ticks(dait DATE, tick INT);
votes(dayt DATE, tick INT, user INT, vote INT);
我需要交叉加入他們dait, tick, user。這就是小提琴有用的地方。
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只在一次投票tick 3上2021-10-27。小提琴的輸出非常接近我想要什么,但我需要排除行(ilocat)19-24,顯示所有空票ticks 1 and 2從user 12跨越的時間范圍。
換句話說,如果一個user已經從來沒有投一個tick,我不希望回傳的行。但是,如果 a至少對 auser投票了一次tick,那么我想回傳與所有日期相對應的所有行(并在user未投票的日子顯示空票)。
我需要查看用戶未投票的所有日期的原因是因為我正在執行稍后的查詢以查找用戶在他們投票的每個刻度上的連續性。可以想象,如果我無法消除那些不必要的行,我嘗試過的查詢將產生非常大的結果。
uj5u.com熱心網友回復:
如果用戶從未對勾號進行過投票,我不想回傳這些行。但是,如果用戶在一個勾上至少投了一次票,那么我想回傳與所有日期相對應的所有行
您應該將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;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/343581.html
下一篇:如何連接同一個表中的資料點?
