plan_id | elementclass | table_no | ress_id | UserID | Status
1 | elementclass1 | 1 | 0 | 0006100022 | N
1 | elementclass1 | 1 | 2 | 0006100022 | N
1 | elementclass2 | 2 | 0 | 0006100021 | N
1 | elementclass4 | 3 | 0 | 0006100023 | N
在上面的行中我期待这样 如果row具有相同的elementclass,table_no但是在该条件下不同的ress_id只取非零的行。如果具有上述条件,则拖曳行为0可以占用任何行。如果两行都为非零,那么它也可以占用任何一行。 现在 对于其他人来说,它可以取值为0.我们可以将group by用于plan_id,因为可能有多个计划。
期望的结果
plan_id | elementclass | table_no | ress_id | UserID | Status
1 | elementclass1 | 1 | 2 | 0006100022 | N
1 | elementclass2 | 2 | 0 | 0006100021 | N
1 | elementclass4 | 3 | 0 | 0006100023 | N
请帮忙。
感谢
答案 0 :(得分:0)
试试这个:
SELECT T1.*
FROM TableName T1 JOIN
(SELECT elementclass,table_no,MAX(ress_id) as ress_id
FROM TableName
GROUP BY elementclass,table_no
)T2 ON T1.elementclass=T2.elementclass AND T1.table_no=T2.table_no AND T1.ress_id=T2.ress_id
<强>解释强>
这里,我们正在为每个elementclass和table_no创建一个临时表T2,其最大值为ress_id。然后我们将这个表与包含这3个字段的原始表连接起来,并从原始表T1中选择所有记录。
结果:
PLAN_ID ELEMENTCLASS TABLE_NO RESS_ID USERID STATUS
-------------------------------------------------------------------
1 elementclass1 1 2 0006100022 N
1 elementclass2 2 0 0006100021 N
1 elementclass4 3 0 0006100023 N
请参阅SQL Fiddle中的结果。
答案 1 :(得分:0)
SELECT * FROM TableName a
WHERE a.ress_id = (SELECT MAX(b.ress_id) FROM TableName b WHERE b.table_no = a.table_no)
GROUP BY a.plan_id,a.table_no
这会给你:
每个plai_id和table_no
每个结果中都有最大的ress_id
答案 2 :(得分:0)
首先获取每个元素类的最大ress id。然后选择相关记录。可能有重复。因此按元素类和ress id分组。
以下陈述并不完全符合您的要求,但也许就足够了。如果出现平局,您将无法获得其中一条记录,但其中一条记录是&#39; 计划ID ,其中一个记录&#39; table nos ,其中一条记录&#39; 用户ID 和其中一条记录&#39; statusses 。因此,当elementclass和ress_id相等时,可以从一个记录获取用户id,从另一个记录获取状态。
select plan_id, mytable.elementclass, table_no, mytable.ress_id, userid, status
from mytable
join
(
select elementclass, max(ress_id) as max_ress_id
from mytable
group by elementclass
) agg on agg.elementclass = mytable.elementclass and agg.max_ress_id = mytable.res_id
group by mytable.elementclass, mytable.ress_id;
(如果有关系,可以编写一个语句来访问完整的记录,但这要复杂得多 - 至少在MySQL中。)