Mysql SQL查询以选择最新的重复项和最大值
我有下面的客户表Mysql SQL查询以选择最新的重复项和最大值,mysql,sql,Mysql,Sql,我有下面的客户表 ID|Cust_ID|Name|Amount| PaidDate 1| 01|Tina| 100|2018-03-07 2| 02|Lisa| 50|2018-03-05 3| 01|Tina| 180|2018-03-07 4| 01|Tina| 20|2018-03-01 因此,我当前的查询是选择最近日期的记录: select ID, Name, Amount, PaidDate from Customer C
ID|Cust_ID|Name|Amount| PaidDate
1| 01|Tina| 100|2018-03-07
2| 02|Lisa| 50|2018-03-05
3| 01|Tina| 180|2018-03-07
4| 01|Tina| 20|2018-03-01
因此,我当前的查询是选择最近日期的记录:
select ID, Name, Amount, PaidDate from Customer C1
where PaidDate in ( select max(PaidDate) from Customer C2
where C1.ID=C2.ID)
结果是这样的
ID|Cust_ID|Name|Amount| PaidDate
1| 01|Tina| 100|2018-03-07
2| 02|Lisa| 50|2018-03-05
3| 01|Tina| 180|2018-03-07
现在,如果有两个相同的PaidDate,我想选择最高金额
请协助,以便我获得以下结果结果(A) 更新: 我尝试了@草莓和@scaisEdge建议的查询,但发现了新的情况
ID|Cust_ID|Name|Amount| PaidDate
1| 01|Tina| 100|2018-03-07
2| 02|Lisa| 50|2018-03-05
3| 01|Tina| 180|2018-03-07
4| 01|Tina| 20|2018-03-01
5| 02|Lisa| 100|2018-03-01
例如,这里有2条Lisa记录,假设查询结果为
结果(A)然而,结果如下所示,因为Lisa的数量是最高的,没有先看PaidDate
ID|Cust_ID|Name|Amount| PaidDate
3| 01|Tina| 180|2018-03-07
5| 02|Lisa| 100|2018-03-01
要求是,如果PaidDate为空,则
获取具有最新值的PaidDate和
如果PaidDate最新值>1
以最大金额获取PaidDate
如果结束
感谢和问候您应该使用两个nestes子查询进行分组
select * from
customer c2
inner join
(
select c.name, max(c.Amount) max_amount , c.paidDate
from Customer c
inner join (
select name, max(paidDate) max_paiddate
from Customer
group by name
) t on t.name = c.name and t.max_paiddate = c.paidDate
group by c.name, c.paidDate
) t2 on t2.name = c2.name
and t2.max_amount = c2.amount
and t2.paidDate = c2.paidDate
根据上述问题的描述,请尝试执行以下SQL查询
SELECT ID,Name,max(Amount),PaidDate
FROM `Customer` group by ID
order by ID desc
考虑以下几点
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(payment_id SERIAL PRIMARY KEY
,user_id INT NOT NULL
,payment_date DATE NOT NULL
,amount DECIMAL(6,2) NOT NULL
);
INSERT INTO my_table VALUES
(1,1,'2018-03-07',100),
(2,2,'2018-03-05', 50),
(3,1,'2018-03-07',180),
(4,1,'2018-03-01', 20);
SELECT x.*
FROM my_table x
JOIN
( SELECT a.user_id
, a.payment_date
, MAX(a.amount) amount
FROM my_table a
JOIN
( SELECT user_id
, MAX(payment_date) payment_date
FROM my_table
GROUP
BY user_id
) b
ON b.user_id = a.user_id
AND b.payment_date = a.payment_date
GROUP
BY user_id
, payment_date
) y
ON y.user_id = x.user_id
AND y.payment_date = x.payment_date
AND y.amount = x.amount;
+------------+---------+--------------+--------+
| payment_id | user_id | payment_date | amount |
+------------+---------+--------------+--------+
| 2 | 2 | 2018-03-05 | 50.00 |
| 3 | 1 | 2018-03-07 | 180.00 |
+------------+---------+--------------+--------+
虽然执行速度很快,因为这种解决方案可能会变得冗长,但您经常看到人们使用未经证明的黑客,就像这样
SELECT a.*
FROM
( SELECT * FROM my_table ORDER BY user_id, payment_date DESC, amount DESC ) a
GROUP
BY user_id;
+------------+---------+--------------+--------+
| payment_id | user_id | payment_date | amount |
+------------+---------+--------------+--------+
| 3 | 1 | 2018-03-07 | 180.00 |
| 2 | 2 | 2018-03-05 | 50.00 |
+------------+---------+--------------+--------+
2 rows in set (0.00 sec)
无法保证这样的解决方案会奏效。事实上,文件暗示不应该这样做。但在实践中,(到目前为止)总是这样。Hm,我们中的一个人需要更多的咖啡。@草莓。。请更好地解释。。我已经喝了很多咖啡,但我不理解你的建议。嗨@scaisEdge我试过你的查询,它确实给了我最近的付款日期和最高金额。但是,它会删除不重复的记录,如上面的示例,ID=02,Lisa.Ah-coffee quotaachieved@straberry…早上=咖啡?首先,您的表存在根本性缺陷。您没有主键,并且包含Name会产生不可接受的冗余。您好@草莓,表中确实有PK。请查找上面更新的字段。我严重怀疑您的主键id是否会被称为cust_idyeah,是否应该切换cust_id和ID@Strawberry我交换字段名。现在看起来不错吧?顺便说一句,这不是真实的数据/表格。
SELECT a.*
FROM
( SELECT * FROM my_table ORDER BY user_id, payment_date DESC, amount DESC ) a
GROUP
BY user_id;
+------------+---------+--------------+--------+
| payment_id | user_id | payment_date | amount |
+------------+---------+--------------+--------+
| 3 | 1 | 2018-03-07 | 180.00 |
| 2 | 2 | 2018-03-05 | 50.00 |
+------------+---------+--------------+--------+
2 rows in set (0.00 sec)