0

我在 sql 中有一个小问题,我无法找到构建正确语句的方法。当“etud”和“mod”在出现次数中相等时,我只需要在结果中包含具有最大“sess”的行:

etud|sess|mod|eta
1------1---M1--nv
1------2---M1--v
2------1---M1--nv
3------1---M1--v
4------1---M1--v

现在我需要的结果是:

etud|sess|mod|eta
1------2---M1--v
2------1---M1--nv
3------1---M1--v
4------1---M1--v

提前致谢 。

4

4 回答 4

3

这实际上只是一个MAX()聚合etud,按and分组mod

SELECT
  etud,
  MAX(sess) AS sess,
  mod
FROM yourtable
GROUP BY etud, mod

编辑问题后更新:

尽管 MySQL 将允许您简单地将列添加到上面的查询中而不将其添加GROUP BY到回来(虽然通常它会是第一个)。

要拉入eta匹配的剩余列,MAX(sess)您可以加入子查询。

SELECT
  main.etud,
  maxsess.maxsess AS sess
  main.mod,
  main.eta
FROM
  yourtable
  JOIN (
    SELECT
      etud,
      MAX(sess) AS maxsess,
      mod
    FROM yourtable
    GROUP BY etud, mod
    /* JOIN all 3 columns of the subquery which gets the MAX() against the rest of the table */
  ) maxsess ON main.etud = maxsess.etud AND main.sess = maxsess.maxsess AND main.mod = maxsess.mod
于 2012-10-11T02:09:52.840 回答
3
SELECT  etud,max(sess),  mod1
FROM tblA
GROUP BY etud, mod1

SQL FIDDLE在这里。

于 2012-10-11T02:11:21.993 回答
3

您可以使用聚合函数。我假设您只需要可以通过此查询检索的sess每个配对的最大值:etud-mod

SELECT etud, max(sess) as sess, mod FROM table GROUP BY etud, mod;

但是如果您只想删除 minimumsess并获取其他行,那么这是一个解决方案:

SELECT etud, sess, mod
FROM table 
JOIN (SELECT etud, min(sess) as sess, mod FROM table GROUP BY etud, mod) AS mintable
  ON table.etud = mintable.etud 
    AND table.mod = mintable.mod
    AND table.sess <> mintable.sess

作为基于您的问题的示例。

etud|sess|mod
1------1------M1
1------2------M1
1------3------M1
2------1------M1
2------2------M1

第一个查询将返回

etud|sess|mod
1------3------M1
2------2------M1

第二个查询将返回

etud|sess|mod
1------2------M1
1------3------M1
2------2------M1
于 2012-10-11T02:14:13.263 回答
0

这是 SQL 表和插入:create table esm (etud INT(11), sess INT(11), modval char(3))

INSERT INTO esm (etud,sess,modval) VALUES ( 1,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 1,2,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 2,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 3,1,'M1');
INSERT INTO esm (etud,sess,modval) VALUES ( 4,1,'M1');

和查询:

SELECT esm1.* FROM esm esm1
INNER JOIN (SELECT MIN(etud) as minetud, sess, modval
FROM  esm
GROUP BY   sess, modval) esm2
ON esm1.sess=esm2.sess AND esm1.modval=esm2.modval
WHERE esm1.etud <> minetud;

我的结果与您期望的结果不同,但我认为它们反映了您对问题的陈述。

+------+------+--------+
| etud | sess | modval |
+------+------+--------+
|    2 |    1 | M1     | 
|    3 |    1 | M1     | 
|    4 |    1 | M1     | 
+------+------+--------+
于 2012-10-11T02:43:19.187 回答