我有一個查詢,它首先宣告并將資料插入到臨時表中。此表用于過濾掉 sql server 中包含客戶資料的主表。
將虛擬資料填充到臨時表中的查詢如下:
Declare @myInputTable TABLE (Customer_input INT, Date_of_interest bigint)
insert into @myInputTable values(12345, '20140924'),(22234,'20210508')
select top 1
MainTable.CustomerID,
MainTable.PurchaseDate
From MainTable
Where (customerID in (select Customer_input from @myInputTable) and PurchaseDate <= (select Date_of_interest from @myInputTable))
當我注釋掉第二個客戶 感興趣的日期時,查詢正常運行并給我結果,但是當它處理多個客戶和感興趣的日期組合時,它會吐出以下錯誤:
子查詢回傳超過 1 個值。當子查詢跟隨 =、!=、<、<=、>、>= 或子查詢用作運算式時,這是不允許的。
我知道問題出在“PurchaseDate <=...”,但我不確定如何過濾掉結果以匹配客戶 ID,只輸出最接近每個客戶感興趣的日期的購買日期記錄。任何指標將不勝感激!
來自 MainTable 的測驗資料:
| 客戶ID | 購買日期 |
|---|---|
| 12345 | 20150120 |
| 12345 | 20140213 |
| 12345 | 20120811 |
| 22234 | 20210419 |
| 22234 | 20220322 |
整體查詢的預期結果:
| 客戶ID | 購買日期 |
|---|---|
| 12345 | 20140213 |
| 22234 | 20210419 |
查詢應排除 >Date_of_interest 的所有 PurchaseDate,并且僅顯示與給定 CustomerID 的 Date_of_interest 最接近的過去 PurchaseDate(與 Customer_input 匹配)。客戶 12345 有 2 個符合條件的日期(20140213 和 20120811),但僅輸出 20140213,因為它最接近 myInputTable 中列出的感興趣日期(12345,'20140924')
uj5u.com熱心網友回復:
我建議您只需要一個內部連接,然后為您想要的結果進行簡單的聚合:
select m.customerId, Max(PurchaseDate) PurchaseDate
From @myInputTable t
join MainTable m on m.CustomerID = t.Customer_input and m.PurchaseDate <= t.Date_of_interest
group by m.customerId;
uj5u.com熱心網友回復:
由于您需要將每個源行映射到變數表中的一行,因此您必須進行連接,而不是簡單地檢查其中某處是否存在值。由于每個客戶只需要一個值,因此您需要使用ROW_NUMBER. 也許是這樣的(未經測驗):
SELECT *
FROM (
SELECT
MT.CustomerID,
MT.PurchaseDate,
Number = ROW_NUMBER() OVER (PARTITION BY MT.CustomerID ORDER BY MT.PurchaseDate DESC)
FROM MainTable MT
INNER JOIN @myInputTable IT
ON MT.CustomerID = IT.Customer_input AND MT.PurchaseDate <= IT.Date_of_interest
) Subquery
WHERE Number = 1
ORDER BY CustomerID, PurchaseDate
uj5u.com熱心網友回復:
這也可以通過與表變數進行內部連接并聚合它來實作。
DECLARE @myInputTable TABLE ( Customer_input INT, Date_of_interest INT ); insert into @myInputTable values (12345, '20140924') , (22234, '20210508') ; SELECT t.CustomerID , MAX(PurchaseDate) AS PurchaseDate FROM MainTable t JOIN @myInputTable i ON i.Customer_input = t.CustomerID AND i.Date_of_interest >= t.PurchaseDate GROUP BY t.CustomerID, i.Date_of_interest
客戶ID 購買日期 12345 20140213 22234 20210419
在這里測驗db<>fiddle
旁注:包含日期的列應具有 DATE 資料型別。
您可以以相同的“yyyyMMdd”格式插入日期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/447895.html
上一篇:SQLServer重命名重復條目
下一篇:SQL觸發器加倍匯總金額
