返回客户的T-SQL搜索

时间:2016-05-19 15:06:14

标签: sql-server tsql

我有一个问题,我现在在那里挣扎。 我真的不知道如何解决这个问题,看起来很简单。

我有客户ID和订单日期。 我只想向客户展示,在2015年之前订购了东西,并在过去10天内购买了一些东西。

我为此创建了一个小测试表 - 让我们说它是2016年1月: enter image description here

现在有客户1,它在1月和2010年进行了购买。好的,这符合我的需要,我想告诉他。 但是客户2去年12月份进行了购买,所以他不是一个"返回"客户,但经常购买我的东西的客户。我不想给他看。

我尝试了类似的东西,但它没有工作:

DF$Screener.Level = as.character(DF$Screener.Level)
DF$Actual.Level = as.character(DF$Actual.Level)

DF$Actual.Level = ifelse(!(is.na(DF$Actual.Level)), DF$Actual.Level,DF$Screener.Level)

2 个答案:

答案 0 :(得分:3)

您需要两个单独的查询。第一个发现那些在过去10天内购买了东西的顾客。第二个使用存在查询来查找超过12个月前购买的相同客户(使用ID加入)。

试试这个:

SELECT [Kunden_ID],Bestellung
FROM [Immo].[dbo].[TEST] AS A
WHERE (Bestellung >=DATEADD (day,-10,getdate())) 
and exists (
select 1
from [Immo].[dbo].[TEST] AS B
where a.[Kunden_ID] = b.[Kunden_ID]
AND b.Bestellung <= DATEADD (month,-12,getdate())
)

另一种方法是使用公用表表达式(CTE)。查看不同的查询会更容易一些。

With Get10Days as (
SELECT [Kunden_ID],Bestellung
FROM [Immo].[dbo].[TEST] AS A
WHERE (Bestellung >=DATEADD (day,-10,getdate())) 
)


select b.Kunden_ID
from [Immo].[dbo].[TEST] AS B
join Get10Days as A on a.Kunden_ID = b.Kunden_ID
where b.Bestellung <= DATEADD (month,-12,getdate())

答案 1 :(得分:0)

我喜欢@jabs的答案,我想提供一种过滤的可能性。

IN 子查询!

SELECT [Kunden_ID],Bestellung
FROM [Immo].[dbo].[TEST] AS A
WHERE (Bestellung >=DATEADD (day,-10,getdate()) 
AND [Kunden_ID] in
--Subquery below
   (SELECT [Kunden_ID]
     FROM [Immo].[dbo].[TEST] AS B
     AND Bestellung <= DATEADD (month,-12,getdate()))

在谈到MSSQL的受支持版本时:Many people认为 EXISTS IN 与性能方面不同,但不是 true。

只需几秒钟,看看实际执行计划,它们的处理方式完全相同(合并加入/内部加入)

screenshot1

screenshot2

你可以看到我也试过 TOP 1 等等,它总是一样的。如果您使用较旧的,不受支持的MSSQL版本,您可能会看到不同的内容。

旁注:两者之间有logical differences。对于一些使用 EXISTS 的大脑更有意义,而对于其他大脑 IN 是有意义的方式,但它与性能无关,因为MSSQL认识到你的意图是