2

我如何使用 SQL 获取最后一笔付款

例子:

SELECT DATEOFPAYMENT
FROM PAYMENTS
WHERE DATEOFPAYMENT = (SELECT MAX(DATEOFPAYMENT) FROM PAYMENTS)

但这不起作用,因为它抱怨要求分组?

4

7 回答 7

2
SELECT DATEOFPAYMENT
FROM PAYMENTS
WHERE DATEOFPAYMENT = (SELECT MAX(DATEOFPAYMENT) FROM PAYMENTS GROUP BY DATEOFPAYMENT);
于 2013-07-19T09:54:19.957 回答
2

如果只需要一个字段,为什么需要子查询?

select max(DateOfPayment)
FROM Payments

如果您想要“最后一次付款”中的所有数据

select p.Id, p.DateOfPayment, p.Name -- don't know your fields, just an example
FROM Payments p
INNER JOIN (select Id, MAX(DateOfPayment) maxdate
            FROM Payments
            GROUP BY Id) as m
  ON m.Id = p.Id and p.DateOfPayment = m.maxdate

如果您只想要其他字段,并且这些其他字段具有最大 dateOfPayment,则不在聚合函数中的所有字段都必须在 GROUP BY 子句中

select p.Id, p.Name, max(p.DateOfPayment)
From Payments p
GROUP BY p.Id, p.Name
于 2013-07-19T09:55:38.183 回答
1

我通常会使用TOPand ORDER BY

SELECT TOP 1 DATEOFPAYMENT
FROM PAYMENTS
ORDER BY DATEOFPAYMENT DESC

或获取整个记录:

SELECT TOP 1 *
FROM PAYMENTS
ORDER BY DATEOFPAYMENT DESC
于 2013-07-19T09:55:18.030 回答
0
SELECT TOP 1 DATEOFPAYMENT
FROM PAYMENTS
ORDER BY DATEOFPAYMENT DESC
于 2013-07-19T09:55:38.457 回答
0

cluase 使用的所有聚合函数:

SELECT DATEOFPAYMENT FROM PAYMENTS WHERE DATEOFPAYMENT = (SELECT MAX(DATEOFPAYMENT) FROM PAYMENTS group by DATEOFPAYMENT)

于 2013-07-19T09:56:39.583 回答
0

你有 2 个选项,选择 MAX 值

select max(DateOfPayment) FROM Payments

或按 DateOfPayment desc 选择前 1 个 DateOfPayment 订单

运行两者,检查计划和性能并选择最好的一个:)

于 2013-07-19T10:00:56.953 回答
0

如果您只是想要它只是在询问最后一次付款

从付款中选择 MAX(付款日期)作为付款日期

或者例如,如果您想要一个列出每位员工最后一次获得报酬的列表,您将使用

SELECT MAX(dateofpayment) 从 Payment GROUP BY EmployeeID

要求您分组的原因是因为您使用的是聚合函数

于 2013-07-19T15:46:26.150 回答