AZHAR SAYYAD Ответов: 1

Как загрузить последнюю запись в SQL


у меня четыре стола
tblUser(UserID PK,name)
tblPackage (PackageID  pk, PackageName)
tblPayment(PaymentID Pk,UserID Fk, PackageID FK,Payingdate,PaidAmount,RemainingBalance)
tblsubscription(subID pk, userID, packageID,PackageExpireDate, PackStartDate)


Вот предположим в моем tblpaymet я добавляю значение
(1,1,1,2016-11-2,2000,8000),
(2,1,1,2016-11-3,3000,7000),
(3,1,1,2016-11-4,2000,8000)


а если тот же пользователь возьмет другой пакет
(4,1,2,2016-11-1,5000,7000),
(5,1,2,2016-11-2,5000,7000),
(6,1,2,2016-11-3,5000,7000),


в этом заявлении я хочу получить последнюю запись каждого пользователя, дифференцируя их packageID означает, что в моем примере я хочу получить только paymentid (3,6), но с помощью этого запроса я получаю всю запись. поэтому, пожалуйста, помогите мне получить последнюю запись каждого пользователя

Что я уже пробовал:

select  users.UserID, users.Name, users.Contact, users.photos, pay.PaymentID, pay.Paying_date, pay.Payble, pay.Discount, pay.Total_Paid,p ay.Balance_Remain, pay.Payment_Mode, pay.Payment_Type, pay.Payment_Describtion, pack.PackageID, pack.Package_Name, pack.Package_Duration, pack.Package_Amount, sub.Package_Expire_Date, sub.Package_StartDate from tblUser as users 
	inner join tblPayment as pay 
	on users.UserID=pay.UserId
	left outer join tblPackages as pack
	on pack.PackageID = pay.PackageId
	inner join tblSubscription as sub 
	on users.UserID = sub.UID

Suvendu Shekhar Giri

.- а что вы пытались добыть из последних записей?

Ключ:

Попробуй GROUP BY с HAVING
или ROW_NUMBER()

1 Ответов

Рейтинг:
5

Richard Deeming

Что-то вроде этого должно сработать:

WITH ctePayment As
(
    SELECT
        PaymentID,
        UserID,
        PackageID,
        Paying_date, 
        Payble,
        Discount, 
        Total_Paid,
        Balance_Remain, 
        Payment_Mode, 
        Payment_Type, 
        Payment_Description, 
        ROW_NUMBER() OVER (PARTITION BY UserID, PackageID ORDER BY Paying_date DESC) As RN
    FROM
        tblPayment
)
SELECT 
    users.UserID, 
    users.Name, 
    users.Contact, 
    users.photos, 
    pay.PaymentID, 
    pay.Paying_date, 
    pay.Payble,
    pay.Discount, 
    pay.Total_Paid,
    pay.Balance_Remain, 
    pay.Payment_Mode, 
    pay.Payment_Type, 
    pay.Payment_Description, 
    pack.PackageID, 
    pack.Package_Name,
    pack.Package_Duration, 
    pack.Package_Amount, 
    sub.Package_Expire_Date, 
    sub.Package_StartDate 
FROM
    tblUser As users 
    INNER JOIN ctePayment As pay 
    ON pay.UserId = users.UserID 
    And pay.RN = 1
    INNER JOIN tblSubscription as sub 
    ON sub.UID = users.UserID
    And sub.PackageID = pay.PackageUD
    INNER JOIN tblPackages As pack
    ON pack.PackageID = pay.PackageID
;


AZHAR SAYYAD

спасибо это прекрасно работает когда я использую с тем же packagID если идентификатор пакета изменить maens если пользователь назначил другой пакет то новый идентификатор пакета заменить на более старый