我希望您能协助解决我几天来一直无法解决的问题。不幸的是,我已经发布了我的问题,并且无法对所提供的建议进行任何改进。
GROUP BY
和HAVING
在某种程度上可以实现CASE WHEN
,我想实现的目标是什么,但是我所做的一切并没有达到我的期望。
我要实现的是GROUP BY
仅当组的内容超过3行并保留单个项目,即未分组时,小于或等于三。
ID DESC VAL1 VAL 2 VAL 3
1 DESC1 2 2 4
2 DESC2 2 2 4
3 DESC3 2 2 4
4 DESC4 2 2 4
5 DESC5 1 1 2
6 DESC6 1 1 2
GROUP BY
将通过以下命令通过 VAL1 , VAL2 , VAL 3
SELECT * FROM TABLE1 GROUP BY VAL1,VAL2,VAL3
这将产生以下内容:
ID DESC VAL1 VAL 2 VAL 3
1 DESC1 2 2 4
5 DESC5 1 1 2
但是我需要以下内容:
ID DESC VAL1 VAL 2 VAL 3
1 DESC1 2 2 4
5 DESC5 1 1 2
6 DESC6 1 1 2
这可以通过GROUP BY
来实现吗,我想到的是子查询,但是我无法管理。非常感谢您的协助。
DBMS是MySQL。
答案 0 :(得分:0)
尝试这个。可能需要一些细微的调整,因为我没有进行测试。但是我想你会明白的。
Select *
from table1
where md5(concat(val1,val2,val3)) in (
SELECT md5(concat(val1,val2,val3))
FROM TABLE1
GROUP BY VAL1,VAL2,VAL3
having count(*) > 3)
group by VAL1,VAL2,VAL3
union
Select *
from table1
where md5(concat(val1,val2,val3)) not in (
SELECT md5(concat(val1,val2,val3))
FROM TABLE1
GROUP BY VAL1,VAL2,VAL3
having count(*) > 3)
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您使用的是MySQL 8.0,则可以使用窗口函数COUNT()
和ROW_NUMBER()
来实现:
SELECT id, descr, val1, val2, val3
FROM (
SELECT
t.*,
COUNT(*) OVER(PARTITION BY val1, val2, val3) cnt,
ROW_NUMBER() OVER(PARTITION BY val1, val2, val3 ORDER BY id) rn
FROM mytable t
) x WHERE cnt < 3 OR rn = 1
ORDER BY id
在内部查询中,cnt
指示有多少记录具有与当前记录相同的val1, va2, val3
。 rn
为具有相同val1, va2, val3
的记录组中的每个记录分配一个等级。然后,外部查询使用这两条信息来过滤相关记录。
| id | descr | val1 | val2 | val3 |
| --- | ----- | ---- | ---- | ---- |
| 1 | DESC1 | 2 | 2 | 4 |
| 5 | DESC5 | 1 | 1 | 2 |
| 6 | DESC6 | 1 | 1 | 2 |