仅在有要分组的行时分组

时间:2019-03-15 22:00:17

标签: mysql sql

我希望您能协助解决我几天来一直无法解决的问题。不幸的是,我已经发布了我的问题,并且无法对所提供的建议进行任何改进。

GROUP BYHAVING在某种程度上可以实现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。

3 个答案:

答案 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种不同情况下,使用UNION ALL:

fmap

请参见demo

答案 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, val3rn为具有相同val1, va2, val3的记录组中的每个记录分配一个等级。然后,外部查询使用这两条信息来过滤相关记录。

Demo on DB Fiddle

| id  | descr | val1 | val2 | val3 |
| --- | ----- | ---- | ---- | ---- |
| 1   | DESC1 | 2    | 2    | 4    |
| 5   | DESC5 | 1    | 1    | 2    |
| 6   | DESC6 | 1    | 1    | 2    |