SQL-按电子邮件和最新日期分组
我有一个SQL查询,应该向我显示每个客户上次支付的款项,但它向我显示所有客户已支付的所有款项。我花了一天的时间在这上面,我要放弃了。我想尝试通过客户电子邮件将我的报告分组,然后从每组客户付款中返回每个组的最新日期。这应该在一份报告中向我显示每个客户最近的付款情况 我正在从多个表中提取信息。理论上,客户可能拥有相同的姓名、号码或支付相同的金额。但这一领域的独特之处在于电子邮件。客户也可以升级他们的帐户,因此客户支付的一组款项可能不都是相同的值。因此,如果我们返回最近的日期,它将显示他们当前的最后一次付款 帮助我,你是我唯一的希望SQL-按电子邮件和最新日期分组,sql,date,email,Sql,Date,Email,我有一个SQL查询,应该向我显示每个客户上次支付的款项,但它向我显示所有客户已支付的所有款项。我花了一天的时间在这上面,我要放弃了。我想尝试通过客户电子邮件将我的报告分组,然后从每组客户付款中返回每个组的最新日期。这应该在一份报告中向我显示每个客户最近的付款情况 我正在从多个表中提取信息。理论上,客户可能拥有相同的姓名、号码或支付相同的金额。但这一领域的独特之处在于电子邮件。客户也可以升级他们的帐户,因此客户支付的一组款项可能不都是相同的值。因此,如果我们返回最近的日期,它将显示他们当前的最后一
SELECT
AccountTypes.Name AS AccountType,
CONVERT(nvarchar, PaymentHistory.DateCreated, 23) AS Prev_Billing_Date,
PaymentHistory.Amount AS Amount,
Users.FirstName AS FName,
Users.LastName AS LName,
Users.Phone AS Phone,
Users.Email AS Email
FROM
AccountTypes
INNER JOIN
Accounts
INNER JOIN
AccountStatus ON Accounts.StatusID = AccountStatus.ID
INNER JOIN
PaymentHistory ON Accounts.ID = PaymentHistory.AccountID
ON AccountTypes.ID = Accounts.AccountTypeID
INNER JOIN
Users
INNER JOIN
UserAccounts ON Users.ID = UserAccounts.UserID
ON Accounts.ID = UserAccounts.AccountID
WHERE
(UserAccounts.IsOwner = 1) AND
(AccountStatus.Name = 'Paid') AND
(Accounts.AccountTypeID = 2 OR
Accounts.AccountTypeID = 3 OR
Accounts.AccountTypeID = 4 OR
Accounts.AccountTypeID = 5)
GROUP BY
AccountTypes.Name,
PaymentHistory.DateCreated,
PaymentHistory.Amount,
Users.FirstName,
Users.LastName,
Users.Phone,
Users.Email
ORDER BY
AccountType DESC, Email, Prev_Billing_Date DESC;
您可以使用
row\u number()
和分区方法来实现所需的功能。您不需要使用分组依据
,因为您没有使用任何聚合函数
SELECT t1.* FROM
(SELECT
AccountTypes.Name AS AccountType,
CONVERT(nvarchar, PaymentHistory.DateCreated, 23) AS Prev_Billing_Date,
PaymentHistory.Amount AS Amount,
Users.FirstName AS FName,
Users.LastName AS LName,
Users.Phone AS Phone,
Users.Email AS Email,
ROW_NUMBER() over (PARTITION BY Users.Email ORDER BY PaymentHistory.DateCreated DESC) as rn
FROM AccountTypes
INNER JOIN Accounts ON AccountTypes.ID = Accounts.AccountTypeID
INNER JOIN AccountStatus ON Accounts.StatusID = AccountStatus.ID
INNER JOIN PaymentHistory ON Accounts.ID = PaymentHistory.AccountID
INNER JOIN UserAccounts ON Accounts.ID = UserAccounts.AccountID
INNER JOIN Users ON Users.ID = UserAccounts.UserID
WHERE
UserAccounts.IsOwner = 1 AND
AccountStatus.Name = 'Paid' AND
Accounts.AccountTypeID IN (2,3,4,5)
) t1
WHERE t1.rn = 1
ORDER BY
t1.AccountType DESC, t1.Email, t1.Prev_Billing_Date DESC;
成功了!!!我真的很想学这个。你能解释一下使用“t1”吗?我以前没见过这种方法。我对SQL真的很陌生。几年前我上过it课,所以我记得基础知识。我将研究如何使用行号和分区。非常感谢你尝试一下。现在我终于可以睡觉了。t1只是子查询的一个表别名。您可以查看此链接。