有表A , 欄位:用戶ID ,卡片ID,卡片型別,發卡時間。
卡片型別有特殊卡和普通卡,隨機發放給用戶;
如何求一個用戶收到兩張特殊卡的間隔中,收到多少張普通卡?

uj5u.com熱心網友回復:
試試下面的,沒測驗過
WITH CTE
AS
(SELECT A.用戶ID,A.發卡時間 AS BEGIN_DATE,B.發卡時間 AS END_DATE
FROM TABLE A
CROSS APPLY (SELECT TOP 1 發卡時間 FROM TABLE WHERE 用戶ID=A.用戶ID AND 卡片型別='特殊卡' AND 發卡時間>A.發卡時間 ORDER BY 發卡時間) AS B
WHERE A.卡片型別='特殊卡')
SELECT B.用戶ID,B.BEGIN_DATE,COUNT(*)
FROM TABLE A
JOIN CTE B ON A.用戶ID=B.用戶ID AND A.發卡時間 BETWEEN B.BEGIN_DATE AND B.END_DATE AND A.卡片型別='普通卡'
GROUP BY B.用戶ID,B.BEGIN_DATE
uj5u.com熱心網友回復:
用單一陳述句的腳本會非常復雜難懂,而且樓主的要求也有點模糊。比如沒有明確用戶可能收到的特殊卡張數。大概做法如下:
1.提取所有特殊卡獲取時間
2.抽取前n-1行資料,將該卡獲取時間設定為起始時間
3.抽取已經提取的資料行的下一行獲取時間,設為終止時間,這個時候應該有n-1行資料
4.然后對于每一行,計算獲得所有普通卡獲取張數
uj5u.com熱心網友回復:
感謝老板回復,但是這個思路在SQL的話應該是不通的,感覺有些瑕疵,我再仔細研究下一樓老哥的回復,我覺得可能是對的
uj5u.com熱心網友回復:
可以用row_number函式按用戶id,卡片id進行分組,按發卡時間排序,用行號進行比較,如row=row+1。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/27941.html
標籤:疑難問題
