我正在計算使用T-SQL的 7 天活躍用戶。我使用了以下代碼:
SELECT
*,
COUNT(DISTINCT [UserID]) OVER (
PARTITION BY [HospitalID], [HospitalName], [Device]
ORDER BY [Date]
ROWS 7 PRECEDING
) AS [7-Day Active Users]
FROM UserActivity
ORDER BY [HospitalID], [HospitalName], [Device], [Date]
有人告訴我Use of DISTINCT is not allowed with the OVER clause。
UserActivity是一個包含HospitalID、HospitalName、Device(手機或平板電腦)Date和UserID(可能為 NULL)列的表。為了使事情變得更容易,我填補了Date連續日期之間的空白,以便我可以ROWS 7 PRECEDING放心使用。我在網上做了很多搜索,發現大多數解決方案要么使用其他型別的 SQL(這在我的情況下是不可能的),要么使用DENSE_RANK不支持移動視窗的函式。解決我的問題的正確且希望更簡單,簡潔的方法是什么?
示例資料:https ://docs.google.com/spreadsheets/d/19vrBK8ixpiPJycRjb1ekiKnEUYk5AaUH/edit?usp=sharing&ouid=110206477774349430845&rtpof=true&sd=true
uj5u.com熱心網友回復:
很抱歉看到這種COUNT DISTINCT型別的 SQL 不支持它……我不知道。尤其是在您費心修復日期之間的差距之后!
我使用Rasgo生成 SQL——所以這不會直接在你的版本中作業(用 Snowflake 測驗),但我認為只要你修復了這個DATEADD函式它就會作業。似乎每個 RDBMS 的做法都DATEADD不同。
這里的一般概念是使用子句range join中的條件將資料連接到自身上。WHERE
幸運的是,這應該對您有用,而無需先修復日期中的空白。
WITH BASIC_OFFSET_7DAY AS (
SELECT
A.HOSPITALNAME,
A.HOSPITALID,
A.DEVICE,
A.DATE,
COUNT(DISTINCT B.USERID) as COUNT_DISTINCT_USERID_PAST7DAY,
COUNT(1) AS AGG_ROW_COUNT
FROM
UserActivity A
INNER JOIN UserActivity B ON A.HOSPITALNAME = B.HOSPITALNAME
AND A.HOSPITALID = B.HOSPITALID
AND A.DEVICE = B.DEVICE
WHERE
B.DATE >= DATEADD(day, -7, A.DATE)
AND B.DATE <= A.DATE
GROUP BY
A.HOSPITALNAME,
A.HOSPITALID,
A.DEVICE,
A.DATE
)
SELECT
src.*,
BASIC_OFFSET_7DAY.COUNT_DISTINCT_USERID_PAST7DAY
FROM
UserActivity src
LEFT OUTER JOIN BASIC_OFFSET_7DAY ON BASIC_OFFSET_7DAY.DATE = src.DATE
AND BASIC_OFFSET_7DAY.HOSPITALNAME = src.HOSPITALNAME
AND BASIC_OFFSET_7DAY.HOSPITALID = src.HOSPITALID
AND BASIC_OFFSET_7DAY.DEVICE = src.DEVICE
讓我知道它是如何作業的,如果它不起作用,我會幫助你。
編輯:對于那些試圖這樣做并陷入困境的人,一個常見的錯誤(我自己手動執行此操作時犯的一個錯誤)是要特別注意 COUNT(DISTINCT(B.col)) 而不是 A.col . 當我使用 Rasgo 生成 SQL 來檢查自己時,我發現了我的錯誤。希望這篇筆記能幫助將來犯同樣錯誤的人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474582.html
上一篇:根據條件匹配并設定孩子的ID
下一篇:選擇符合所有動態id集的行
