来点儿数据吧,这样是没有结果的。看来楼主对GROUP BY的理解还不够深。请参考: SELECT fieldA, fieldB, MAX(fieldC), MAX(fieldD) FROM tb GROUP BY fieldA, fieldB
group by 是分级统计的,没有参加分组统计的字段,用必须用到集合函数sum(),count(),avg等或许方便的话,你可以帖一点测试数据出来
a b c * * 星期1 * * 星期1 * * 星期2 * * 星期3 * * 星期2我现在就想将查出来的这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 */
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 */ 比如现在又3个字段,现在有5条数据 a b c * * 3 * * 3 * * 0 * * 0 * * 1我需要查出来是三条 * * 3 * * 0 * * 1 具体是哪一条没关系,只要C字段的值不重复就行
用distinct 过滤掉重复数据 select distinct * from tb
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了
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的功能
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
*/
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
*/
比如现在又3个字段,现在有5条数据
a b c
* * 3
* * 3
* * 0
* * 0
* * 1我需要查出来是三条
* * 3
* * 0
* * 1
具体是哪一条没关系,只要C字段的值不重复就行
select distinct *
from tb
将simulation_section字段去重,因为group by需要将分组前面的所有字段都加上,所以我将不用分组的字段加了一个min并显示出来,目的是不让其它字段参加分组,在个因为我对顺序没要求,所以这么做就OK了