Выбор отдельных значений путем просмотра минимальной даты в столбце даты - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь добавить в свой существующий запрос что-то, что отфильтровывало бы любые продажи / покупки, которые происходят более одного раза, только принимая минимальное значение даты.

Я пытался использовать функцию MIN ()и оператор GROUP BY, но это не позволяет мне выбрать другие нужные мне столбцы, и это, как предполагается, ВИД, который я использую в POWER BI.

РЕДАКТИРОВАТЬ: Хорошо, я думаю, я понял этоиз.Я просто использую функцию MIN () и предложение GROUP BY, однако раньше я не использовал предложение GROUP BY и боюсь, что оно отфильтрует слишком много строк.Мне нужны все столбцы, которые перечислены ниже.Я также добавил образцы данных для игры.Мне нужно отфильтровать «дубликаты» ContractPurchaseID, посмотрев на PaymentDue и выбрав только первый.В чем опасность использования 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 голосов
/ 11 февраля 2019

Вы можете попробовать использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...