sql server之group by分组问题

liuandsky 2013-08-28 04:37:11
我现在对表里的一个字符串字段进行分组,作用是去重,在网上找的用法是在group by语句内将所有列名都包含进行,但是都包含进去后查出来的是不对的,请问应该怎么用。

原用法select * from tableName group by 分组的字段
网上教的用法select * from tableName group by 分组的字段,剩下的所有字段全部追加上

很显然后者查出来的就不对,但是分组group by要求将足有字段都加进去,搞不懂,求教!

坐等。。。。
...全文
265 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
comcyd 2015-02-04
  • 打赏
  • 举报
回复
路过帮顶赚积分
KeepSayingNo 2013-08-29
  • 打赏
  • 举报
回复
是的,只要是不参与分组的字段都用聚合函数处理就行,例如min()或者max()等
liuandsky 2013-08-29
  • 打赏
  • 举报
回复
select min(id) id,min(project_id) project_id,min(submit_data_name) submit_data_name,simulation_section from simulation_submit_data where project_id = 1 group by simulation_section 将simulation_section字段去重,因为group by需要将分组前面的所有字段都加上,所以我将不用分组的字段加了一个min并显示出来,目的是不让其它字段参加分组,在个因为我对顺序没要求,所以这么做就OK了
Shawn 2013-08-29
  • 打赏
  • 举报
回复
引用 8 楼 liuandsky 的回复:
比如现在又3个字段,现在有5条数据 a b c * * 3 * * 3 * * 0 * * 0 * * 1 我需要查出来是三条 * * 3 * * 0 * * 1 具体是哪一条没关系,只要C字段的值不重复就行
跟以前的数据,有什么区别,没看出来。 要求按出现过的顺序展示?
liuandsky 2013-08-29
  • 打赏
  • 举报
回复
引用 9 楼 hdhai9451 的回复:
用distinct 过滤掉重复数据 select distinct * from tb
你这个不能用啊,这个不是全选么
Andy__Huang 2013-08-29
  • 打赏
  • 举报
回复
用distinct 过滤掉重复数据 select distinct * from tb
liuandsky 2013-08-29
  • 打赏
  • 举报
回复
引用 7 楼 wwwwgou 的回复:
[quote=引用 5 楼 liuandsky 的回复:] 我现在就想将查出来的这5条数据中的C字段取出123三个数据,重复的就不要了类似于std::set的功能
if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [a] varchar(100), [b] varchar(100), [c] varchar(100));
insert #temp
select '*','*','星期1' union all
select '*','*','星期1' union all
select '*','*','星期2' union all
select '*','*','星期3' union all
select '*','*','星期2' 

--#1.楼主给的数据不全,其实还有其它几种写法:
SELECT b.* FROM
(select DISTINCT c from #temp) a
CROSS APPLY
(SELECT TOP(1) * FROM #temp m WHERE m.c=a.c ORDER BY GETDATE()) b

--#2.
;WITH cte AS
(
	SELECT rowid =ROW_NUMBER() OVER(PARTITION BY c ORDER BY GETDATE()), * FROM #temp
)
SELECT a,b,c FROM cte
WHERE rowid = 1
/*
a	b	c
*	*	星期1
*	*	星期2
*	*	星期3
*/
[/quote] 比如现在又3个字段,现在有5条数据 a b c * * 3 * * 3 * * 0 * * 0 * * 1 我需要查出来是三条 * * 3 * * 0 * * 1 具体是哪一条没关系,只要C字段的值不重复就行
Shawn 2013-08-28
  • 打赏
  • 举报
回复
引用 5 楼 liuandsky 的回复:
我现在就想将查出来的这5条数据中的C字段取出123三个数据,重复的就不要了类似于std::set的功能
if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [a] varchar(100), [b] varchar(100), [c] varchar(100));
insert #temp
select '*','*','星期1' union all
select '*','*','星期1' union all
select '*','*','星期2' union all
select '*','*','星期3' union all
select '*','*','星期2' 

--#1.楼主给的数据不全,其实还有其它几种写法:
SELECT b.* FROM
(select DISTINCT c from #temp) a
CROSS APPLY
(SELECT TOP(1) * FROM #temp m WHERE m.c=a.c ORDER BY GETDATE()) b

--#2.
;WITH cte AS
(
	SELECT rowid =ROW_NUMBER() OVER(PARTITION BY c ORDER BY GETDATE()), * FROM #temp
)
SELECT a,b,c FROM cte
WHERE rowid = 1
/*
a	b	c
*	*	星期1
*	*	星期2
*	*	星期3
*/
發糞塗牆 2013-08-28
  • 打赏
  • 举报
回复
distinct就可以实现
liuandsky 2013-08-28
  • 打赏
  • 举报
回复
引用 3 楼 wwwwgou 的回复:
来点儿数据吧,这样是没有结果的。看来楼主对GROUP BY的理解还不够深。请参考:
SELECT
	fieldA,
	fieldB,
	MAX(fieldC),
	MAX(fieldD)
FROM tb
GROUP BY
	fieldA,
	fieldB
a b c * * 星期1 * * 星期1 * * 星期2 * * 星期3 * * 星期2 我现在就想将查出来的这5条数据中的C字段取出123三个数据,重复的就不要了类似于std::set的功能
Andy__Huang 2013-08-28
  • 打赏
  • 举报
回复
group by 是分级统计的,没有参加分组统计的字段,用必须用到集合函数sum(),count(),avg等 或许方便的话,你可以帖一点测试数据出来
Shawn 2013-08-28
  • 打赏
  • 举报
回复
来点儿数据吧,这样是没有结果的。看来楼主对GROUP BY的理解还不够深。请参考:
SELECT
	fieldA,
	fieldB,
	MAX(fieldC),
	MAX(fieldD)
FROM tb
GROUP BY
	fieldA,
	fieldB
發糞塗牆 2013-08-28
  • 打赏
  • 举报
回复
去重没必要搞group by
發糞塗牆 2013-08-28
  • 打赏
  • 举报
回复
select distinct * from tableName

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧