我有兩個表,點擊:
user date
a 01/10/2021
a 02/10/2021
a 03/10/2021
b 27/09/2021
c 08/10/2021
c 13/10/2021
和段:
user date segment
a 26/09/2021 1
a 27/09/2021 1
a 03/10/2021 2
c 01/10/2021 5
c 10/10/2021 6
我想將細分加入點擊以識別給定點擊日期每個用戶的最新細分。所以正確的輸出將如下所示:
user date segment
a 01/10/2021 1
a 02/10/2021 1
a 03/10/2021 2
b 27/09/2021
c 08/10/2021 5
c 13/10/2021 6
我嘗試了以下操作,但收到錯誤“由于內部錯誤,不支持這種型別的相關子查詢模式”
select *,
(select top 1 segment
from b
where
b.date <= a.date
ORDER BY ROW_NUMBER() OVER(PARTITION BY b.id ORDER BY b.date DESC)) as segment_lookup
from a;
非常感謝找到最佳方法的任何幫助。提前致謝
uj5u.com熱心網友回復:
你沒有提到資料庫,所以我假設它是 SQL Server。
此外,第一個表似乎沒有鍵,因此下面的查詢使用 ( user, date) 作為鍵。
你可以做:
select *
from (
select
c.*, s.segment,
row_number() over(partition by c.u, c.d order by s.d desc) as rn
from clicks c
left join segment s on s.u = c.u and c.d >= s.d
) x
where rn = 1
結果:
u d segment rn
-- ----------- -------- --
a 2021-10-01 1 1
a 2021-10-02 1 1
a 2021-10-03 2 1
b 2021-09-27 1
c 2021-10-08 5 1
c 2021-10-13 6 1
請參閱db<>fiddle 1處的運行示例。
或者,您可以使用理論上具有更好性能的橫向連接。
編輯:按要求添加橫向連接
帶有橫向連接的查詢可以采用以下形式:
select
c.*, s.segment
from clicks c
outer apply (
select top 1 * from segment s where s.u = c.u and c.d >= s.d
order by s.d desc
) s
結果:
u d segment
-- ----------- -------
a 2021-10-01 1
a 2021-10-02 1
a 2021-10-03 2
b 2021-09-27
c 2021-10-08 5
c 2021-10-13 6
請參閱db<>fiddle 2處的運行示例。
如果segment (u, d)創建了索引,橫向連接可能會非常高效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/394460.html
上一篇:從一張表創建兩個聚合虛擬表并加入
