【问题标题】:Displaying records that have more than 5 days inbetween them显示间隔超过 5 天的记录
【发布时间】:2016-10-05 08:30:43
【问题描述】:
我有两张桌子,
tblCustomer
客户 ID(PK)、名字、姓氏)
tblPurchases
PurchaseID(PK)、PurchaseDate、Qty、CustomerID(FK)。
我想按以下方式显示自上次购买后五 (5) 天或更长时间后购买产品的所有客户。
FirstName diff in days since last purchase
Alex 7
谢谢!
【问题讨论】:
标签:
sql
sql-server
tsql
join
datediff
【解决方案1】:
试试下面的查询。
SELECT FirstName, DATEDIFF(DAY, t.PurchaseDate, getdate()) as 'diff in days since last purchase'
FROM tblCustomer c
JOIN (SELECT CustomerID, MAX(PurchaseDate)PurchaseDate
FROM tblPurchases
GROUP BY CustomerID )t ON c.CustomerID=t.CustomerID
WHERE DATEDIFF(DAY, PurchaseDate, getdate())>5
【解决方案2】:
SELECT FirstName,
DATEDIFF(DAY, t.PurchaseDate, getdate()) 'diff in days since last purchase'
FROM tblCustomer c
JOIN (SELECT CustomerID, MAX(PurchaseDate)PurchaseDate
FROM tblPurchases
GROUP BY CustomerID )t ON c.CustomerID=t.CustomerID
WHERE DATEDIFF(DAY, t.PurchaseDate, getdate())>5
【解决方案3】:
通过连接两个表格,根据每个 CustomerId 的最后购买日期给出一个行号。
然后使用DATEDIFF求current date和PurchaseDate之间的天数差异。
并在WHERE子句中给出天数差异。
查询
;WITH CTE AS(
SELECT [rn] = ROW_NUMBER() OVER(
PARTITION BY t.[CustomerID]
ORDER BY t.[PurchaseDate] DESC
), t.[CustomerID], t.[FirstName], t.[PurchaseDate]
FROM (
SELECT t1.[CustomerID], t1.[FirstName], t2.[PurchaseDate]
FROM [tblCustomer] t1
JOIN [tblPurchases] t2
ON t1.[CustomerID] = t2.[CustomerID]
)t
)
SELECT [FirstName],
DATEDIFF(DAY, [PurchaseDate], GETDATE()) AS [diff in days since last purchase]
FROM CTE
WHERE [rn] = 1
AND DATEDIFF(DAY, [PurchaseDate], GETDATE()) > 5;
【解决方案4】:
;WITH T AS
(
SELECT
*,
DATEDIFF(DAY, [PurchaseDate], GETDATE()) AS DiffInDays
FROM @tblPurchases
WHERE DATEDIFF(DAY, [PurchaseDate], GETDATE()) > 5
)
SELECT
C.FirstName,
MAX(DiffInDays) AS DiffInDays
FROM T
LEFT JOIN @tblCustomer C ON T.CustomerId=C.CustomerId
GROUP BY C.FirstName