通过查看日期列的最小日期来选择不同的值

时间:2019-02-11 03:10:17

标签: sql sql-server ssms

我正在尝试向现有查询中添加一些内容,以仅采用最小日期值来过滤发生多次的任何销售/购买。

我尝试使用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)

1 个答案:

答案 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
相关问题