Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询以选择最新的重复项和最大值_Mysql_Sql - Fatal编程技术网

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)