繁体   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