我在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
提前致谢。
答案 0 :(得分:3)
这只是一个MAX()
aggregate,按etud
和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
答案 1 :(得分:3)
SELECT etud,max(sess), mod1
FROM tblA
GROUP BY etud, mod1
SQL FIDDLE here.
答案 2 :(得分:3)
您可以使用aggregate functions。我假设您只想要通过此查询检索的每个sess
配对中的最大etud-mod
:
SELECT etud, max(sess) as sess, mod FROM table GROUP BY etud, mod;
但是,如果您只想删除最小sess
并获取其他行,那么这就是一个解决方案:
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
答案 3 :(得分:0)
这是SQL表&amp;刀片: 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 |
+------+------+--------+