我有一个问题,我现在在那里挣扎。 我真的不知道如何解决这个问题,看起来很简单。
我有客户ID和订单日期。 我只想向客户展示,在2015年之前订购了东西,并在过去10天内购买了一些东西。
现在有客户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)
答案 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。
只需几秒钟,看看实际执行计划,它们的处理方式完全相同(合并加入/内部加入)
你可以看到我也试过 TOP 1 等等,它总是一样的。如果您使用较旧的,不受支持的MSSQL版本,您可能会看到不同的内容。
旁注:两者之间有logical differences。对于一些使用 EXISTS 的大脑更有意义,而对于其他大脑 IN 是有意义的方式,但它与性能无关,因为MSSQL认识到你的意图是