MySQL选择distinct和max与所有列

时间:2017-03-29 14:10:38

标签: mysql greatest-n-per-group

我有一个db表:pf_pqs:

+----------+------+--------+-------+---------+
|    onr   | prSh | liteNr | seqNr | planQty |
+----------+------+--------+-------+---------+
| 10347006 | HEG  |    1   |    0  |   5     |
| 10347006 | TEH  |    1   |    1  |   5     |
| 10347006 | KAR  |    1   |    2  |   5     |
| 10347006 | LEN  |    1   |    3  |   5     |
| 10347006 | HEG  |    2   |    0  |   5     |
| 10347006 | LEN  |    2   |    1  |   5     |
| 10347006 | HEG  |    3   |    0  |   5     |
| 10347006 | TEH  |    3   |    1  |   5     |
| 10347006 | KAR  |    3   |    2  |   5     |
| 10347006 | LEN  |    3   |    3  |   5     |

结果必须包含每个seqNr中最大的liteNr以及所有其他相应字段;像这样:

+----------+------+--------+-------+---------+
|    onr   | prSh | liteNr | seqNr | planQty |
+----------+------+--------+-------+---------+
| 10347006 | LEN  |    1   |    3  |   5     |
| 10347006 | LEN  |    2   |    1  |   5     |
| 10347006 | LEN  |    3   |    3  |   5     |

我尝试使用连接和分组进行不同的查询但到目前为止没有运气:(。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

假设liteNr和seqNr不重复自己,这样的事情应该有效:

SELECT
     p1.onr, 
     p1.prSh, 
     p1.liteNr, 
     p1.seqNr, 
     p1.planQty
FROM
    pf_pqs p1
    INNER JOIN (
        SELECT
            liteNr,
            MAX(seqNr) AS seqNr 
        FROM
            pf_pqs
        GROUP BY
            liteNr  
    ) p2 ON
    p2.liteNr = p1.liteNr
    AND p2.seqNr = p1.seqNr

答案 1 :(得分:0)

正确查询

SELECT
         p1.onr, 
         p1.prSh, 
         p1.liteNr, 
         p1.seqNr, 
         p1.planQty
    FROM
        pf_pqs p1
        INNER JOIN (
            SELECT
                onr,
                liteNr,
                MAX(seqNr) AS seqNr 
            FROM
                pf_pqs
            GROUP BY
                liteNr  
        ) p2 ON
        p2.liteNr = p1.liteNr
        AND p2.seqNr = p1.seqNr
        AND p2.onr=p1.onr

答案 2 :(得分:-1)

您需要选择每个liteNr的最大seqNr,您可以通过SELECT liteNr, MAX(seqNr) ... GROUP BY liteNr选择。然后使用ON a.liteNr = b.liteNr AND a.seqNr = b.seqNr将其与表格连接起来。像这样的查询需要两个步骤。使用第一个查询,您可以查询每个liteNr的最大seqNrs,但这只会为您提供两列(liteNr, seqNrMax),您现在必须在原始表中再次查找,您可以使用连接或嵌套选择。

但是,如果您有两行最大seqNr,那么您的最终结果可能包含您需要注意的重复项。

mysql> SELECT `NAME`, `PRICE`, 
          `VENDOR` 
   FROM `PRODUCTS` `P1` 
   WHERE `P1`.`PRICE` = (
    SELECT MIN(`PRICE`) 
    FROM `PRODUCTS` `P2` 
    WHERE `P2`.`NAME` = `P1`.`NAME`);


mysql> SELECT `P1`.`NAME`, `N` AS `PRICE`, 
          `P1`.VENDOR
   FROM `PRODUCTS` `P1` 
   JOIN ( 
    SELECT `NAME`, MIN(`PRICE`) AS `N` 
    FROM `PRODUCTS` `P2` 
    GROUP BY `NAME`) `P2` 
   ON `P1`.`NAME` = `P2`.`NAME`
   WHERE `P1`.`PRICE` = `N`;

这两种最常见的方法是进行这类查询,但至少有三种其他方法可以做到这一点。