我正在尝试向现有查询中添加一些内容,以仅采用最小日期值来过滤发生多次的任何销售/购买。
我尝试使用MIN()函数和GROUP BY运算符,但是这样做不允许我选择我需要的其他列,并且这应该是要放入POWER BI的VIEW。 / p>
编辑:好的,我想我已经知道了。我只是使用MIN()函数和GROUP BY子句,但是之前我没有使用过GROUP BY子句,而且我担心它会过滤掉太多的行。我需要下面列出的所有列。我还添加了示例数据。我需要通过查看PaymentDue并仅选择第一个来过滤掉“重复的” ContractPurchaseID。使用GroupBY有什么危险?
样本数据:
PurchaseLogID StoreID UserID ContractPurchaseID PackageName PurchaseDate PaymentDue PurchaseAmount EverGreenPrice
118849930 7306 48938416 7825299 Monthly Unlimited 2/11/2019 2/11/2019 84 109
118849935 7306 48938416 7825299 Monthly Unlimited 2/11/2019 3/11/2019 109 109
118404876 6700 22920416 6610879 Monthly Unlimited 3/1/2019 3/1/2019 119 119
118746691 6700 23081863 6240459 Monthly Unlimited 3/1/2019 3/1/2019 159 159
118271837 7308 48668745 7777689 8 Pack Monthly 3/1/2019 3/1/2019 89 89
118271747 7308 48668763 7777679 8 Pack Monthly 3/1/2019 3/1/2019 89 89
查询:
SELECT P.PurchaseLogID,
P.StoreID,
P.UserID,
P.ContractPurchaseID,
P.PackageName,
P.PurchaseDate,
P.PaymentDue,
P.PurchaseAmount,
C.EvergreenPrice
FROM PurchaseLog AS P
INNER JOIN ContractPurchases AS C
ON P.ContractPurchaseID = C.ContractPurchaseID
INNER JOIN Users AS U
ON C.UserID = U.UserID
WHERE P.PaymentDue >= DATEADD(Day, -1, getdate())
AND P.PaymentDue <= DATEADD(Day, +30, getdate())
AND P.Deleted IS NULL
AND (P.PaymentDue < C.CancelOn OR C.CancelOn IS NULL)
AND P.PurchaseAmount <> '0'
AND (haspastdue IS NULL OR haspastdue = 0)
答案 0 :(得分:1)
您可以尝试使用row_number()
窗口功能
select * from
(
SELECT P.PurchaseLogID, P.StoreID, P.UserID, P.ContractPurchaseID, P.PackageName, P.PurchaseDate, P.PaymentDue, P.PurchaseAmount, C.EvergreenPrice,row_number() over(partition by P.PurchaseLogID, P.StoreID, P.UserID, P.ContractPurchaseID order by P.PaymentDue) as rn
FROM PurchaseLog AS P
INNER JOIN ContractPurchases AS C ON P.ContractPurchaseID = C.ContractPurchaseID
INNER JOIN Users AS U ON C.UserID = U.UserID
WHERE P.PaymentDue >= DATEADD(Day, -1, getdate()) AND P.PaymentDue <= DATEADD(Day, +30, getdate())
AND P.Deleted IS NULL
AND (P.PaymentDue < C.CancelOn OR C.CancelOn IS NULL)
AND P.PurchaseAmount <> '0'
AND ( haspastdue IS NULL OR haspastdue = 0)
)A where rn=1