簡體   English   中英

在子查詢中使用 <= 到 output 結果

[英]Using <= in Subquery to output results

我有一個首先聲明數據並將其插入到臨時表中的查詢。 該表用於過濾掉 sql 服務器中包含客戶數據的主表。

將虛擬數據填充到臨時表中的查詢如下:

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 <= ...”,但我不確定我還能如何過濾出結果以匹配 customerIDs 並且只有 output 最接近每個客戶感興趣日期的購買日期記錄。 任何指針將不勝感激!

來自 MainTable 的測試數據:

客戶ID 購買日期
12345 20150120
12345 20140213
12345 20120811
22234 20210419
22234 20220322

整體查詢的預期結果:

客戶ID 購買日期
12345 20140213
22234 20210419

查詢應排除所有 >Date_of_interest 的 PurchaseDate,並僅顯示最接近給定 CustomerID(與 Customer_input 匹配)的 Date_of_interest 的過去 PurchaseDate。 客戶 12345 有 2 個符合條件的日期(20140213 和 20120811),但僅輸出 20140213,因為它最接近 myInputTable 中列出的感興趣日期(12345,'20140924')

我建議你所需要的只是一個內部連接,然后簡單聚合以獲得你想要的結果:

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;

由於您需要將每個源行 map 轉換為變量表中的一行,因此您必須進行連接,而不是簡單地檢查其中某處是否存在值。 由於每個客戶只需要一個值,因此您需要使用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

這也可以通過與表變量進行內部連接並對其進行聚合來實現。

 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”格式插入日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM