oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!相关的知识,希望对你有一定的参考价值。
用 distinct 不行 应为有多个字段 所以 不管用
SELECT sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id FROM table_name where user_id=1
主要是想过滤model_id 这个字段的
要么你用group by 但是group by和distinct的效果是一样的。追问
能举个 例子吗 亲
追答SELECT DISTINCT COL1,COL2,COL3 FROM TABLE1
SELECT COL1,COL2,COL3 FROM TABLE1 GROUP BY COL1,COL2,COL3
上面两句的效果是一样的。
你又要在select中选取,又想distinct 这个是不符合逻辑的,因为除了model_id,其他字段的值是不一样的,distinct是把所有字段值相同的记录只筛选一条。
那用group by 吗 ? 亲 把我 补充的那个 语句 给小弟我拼装一下吧
追答SELECT sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id
FROM table_name
WHERE user_id=1
GROUP BY sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage,
spec, brand_name, show_flag, model_id
GROUP BY 一般用于统计方面,比如你model_id=1一共有5条记录,然后select count(*) from table_name where user_id=1 group by model_id 返回的结果是5,类似count,sum,max这些函数后面就要跟上group by,否则用distinct就可以了。
我不是要回去又多少条数 ,而是要取得每个字段的值啊!
ELECT sequence_no, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id FROM table_name WHERE user_id=1
GROUP BY sequence_no, product_mode,model_code,rated_voltage,
spec, brand_name, show_flag, model_id
并且过滤掉重复的数据 这样的我试过了 还是 不能过滤掉
只有所有字段的值都相同才会过滤掉,你还没明白吗?
即使model_id一样其他字段值不一样,还是过滤不掉的
例如model_id sequence_no
1 1
1 2
1 2
1 3
select model_id,sequence_no from table_name where user_id=1 group by model_id,sequence_no
结果是
model_id sequence_no
1 1
1 2
1 3
是a,b,c组合值的不同,并不只是针对a.! 参考技术B 举个例子吧
mysql 查询
mysql 查询
1: Distinct
有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(即所有查询的字段)
注意: distinct必须放在要查询字段的开头
eg:
1:select distinct user_name from xxx 这样会过滤掉user_name 重复的,
2:如果这样写: select distinct id, user_name, password from xxx mysql会认为要过滤掉 id、user_name 、 password 都重复(完全一样)的,不然只要有一个字段不一样都会被查询出来;
注意:如果查询的有时间字段只有当时间的年月日时分秒都重复时才会被过滤掉
所以一般distinct用来查询不重复记录的条数。
如果要查询不重复的记录,有时候可以用group by
2:order by
注意:Mysql5.7及以上版本group by 子查询中order by 无效
如何解决?
1: 通过limit 语句使子查询的order by生效
但是这必须保证limit的数量,所以也可以使用DISTINCT实现。
3: group by
注意:使用group by 后默认返回的是每个组中id 最小的那一条记录
问题1: 对于mysql中的group by分组后如何获取组内创建时间最大(或最小)的那行数据 ?
以最大为例:
思路: 先对要查询的数据先进行降序排序,然后在使用group by 即可,但是会使用到子查询先排序(这里需要注意上面说到的order by)
SELECT * FROM( SELECT DISTINCT * FROM a ORDER BY a.start_time DESC ) AS b GROUP BY b.id
问题2:对一个结果集分组后怎么取每个分组的两条(或多条)最大(或最小)的数据?
取最大的两条:
SELECT * FROM student_score AS a WHERE ( SELECT COUNT(*) FROM student_score AS b WHERE a.student_name=b.student_name AND a.score<b.score )<2 ORDER BY a.score DESC
取最小的两条:
SELECT * FROM student_score AS a WHERE ( SELECT COUNT(*) FROM student_score AS b WHERE a.student_name=b.student_name AND a.score>b.score )<2 ORDER BY a.score DESC
以上是关于oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!的主要内容,如果未能解决你的问题,请参考以下文章