2017-03-29 42 views
0

我有一个数据库表:pf_pqs:MySQL的选择不同和最大值所有列

+----------+------+--------+-------+---------+ 
| 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  | 

结果必须包括最大每liteNr正确所有其他相应的字段seqNr;像这样:

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

我提前尝试了不同的查询连接和分组,但至今没有运气:( 感谢

+0

你只seqNr和liteNr感兴趣吗? – dsharew

+0

*“结果必须在每个'liteNr'中包含最大的'seqNr',并且所有其他相应的字段”* - 'GROUP BY'在这里没有帮助。您想要从表中返回行,但“GROUP BY”不会返回表中的行。它**使用表中的值生成**值。 – axiac

+0

Group By帮助您找到每个liteNr最大的seqNr。然后将这些值返回到表中以获取相应的行。有tou尝试过发布的代码? – CrazyMenConnected

回答

0

假设然后liteNr和seqNr不重复themselfs,这样的事情应该工作:

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 
+0

这似乎工作,当我只有一个onr值(10347006),但我也需要选择onr字段。实际上我有数千个不同的值。我在哪里放WHERE子句? WHERE onr = 10347006 – Kalle

+0

如果你想过滤结果,只有一个onr值,应该在哪里放置内部select。 – CrazyMenConnected

+0

将SELECT onr添加到内部select,并在最后添加p2.onr = p1.onr,现在得到了正确的结果。谢谢 – Kalle

-1

您需要选择每liteNr您可以通过SELECT liteNr, MAX(seqNr) ... GROUP BY liteNr做最大seqNr。 。然后你使用ON a.liteNr = b.liteNr AND a.seqNr = b.seqNr加入这个表格,这样的查询需要两步:第一个查询你查询每个liteNr的最大seqNrs,但是这只会给你两列(liteNr, seqNrMax),你现在必须再次查找原始表,您可以使用连接或嵌套选择来完成。

但是,如果您有两行max 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`; 

是做这些类型的查询的两种最常见的方式,但至少有三种其他方式来做到这一点。

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