关于T-sql中group by的小小疑问?(100分)

  • 主题发起人 主题发起人 sportsman
  • 开始时间 开始时间
S

sportsman

Unregistered / Unconfirmed
GUEST, unregistred user!
有这样一个表:test
id code time text
1 1001 2000-10-1 中郭啊上的分
2 1001 1999-9-10 啊上的分
3 1002 2000-3-5 萨克的胜利
4 1002 1998-7-9 啊收到了
5 1003 1995-1-2 阿斯空间
6 1003 1998-2-4 加快客观
select code,max(time) as time from test group by code
以上语句只能把两个字段选出来。
我想把每一code,按最大的时间把所有字段(*)都选出来。
有何良方?
 
您先等等,我要按照您的数据测试。别象刚才的那个。我测试过了,人家结束了。
 
好的,我等您。
 
写成下面这样:
select code,fieldA,fieldB,fieldC,max(time) as time from Test
group by code,fieldA,fieldB,fieldC
 
比较复杂一点,无法使用简单的SQL语句.
如果是我,我选择这样的解决方法:
首先使用select code,max(time) as time from test group by code
得到所有值,然后
select * from test
where code =:code and time =:time
呵呵,如果不要求一次找到所有的记录,这个方法不错。
 
to wangjerry:
如果写成下面这样:
select code,fieldA,fieldB,fieldC,max(time) as time from Test
group by code,fieldA,fieldB,fieldC
会选出所有结果。我要返回这样的:
id code time text
1 1001 2000-10-1 中郭啊上的分
3 1002 2000-3-5 萨克的胜利
5 1003 1995-1-2 阿斯空间

to jianl:
确实如此。可我要在存储过程中完成,最好一句话就能选出来。

to 千中元:您快点,我的分在跳了。。。。。。haha
 
好像比较容易,老千要是解决不了,我来帮你 :-)
(给老千一个机会吧...)
 
to 温柔一刀:
您回答了,老千同样有分。。。。。。
 
select * from test a where time =
(select max(time) from test b
where a.id = b.id and a.code =b.code )
假设ID,CODE是主键,作个内连接,应该是这样的(我还没测试过)
 
select id,code,times,texts
from c
where times in
(select max(times)
from c
group by code)
按照你给的测试数据呢以上没错误,但按照我给的测试数据可出现麻烦了。
什么bug俺就不说了, 先骗分要紧
 
to netwind:
我看了一下,回家测试。不过,没有group by能行吗?
 
应该可以吧...
 
netwind把所有的记录都选出来了
 
to 千中元:
哈哈,如果时间有重复呢?codeA的最大时间==codeB的不是最大时间
 
。。。。。吐血
 
to 千中元:
哈哈,分分不是好骗的。。。。。。
to netwind:
如千中元所说。。。。。。
 
to sportsman:
对不起,
好象是我理解错了,你在()内的语句上加个GROUP BY code试试
BTW,近来看你数据库方面的帖子比较多,是不是有大项目啊:)
 
to sportsman:

>>您回答了,老千同样有分。。。。。。
那可不行,我回答了,分数就应该都给我,怎么能给别人呢?
正是因为不喜欢与他人共享分数,我才很少第一个回答问题,
--给别人多一点机会嘛!可是他们回答不出来的话,就不应该获得分数。

不过这次我“法外开恩”,可以给我92分或者87分--让我的分数变成“整数” :-)

to netwind:

其实你的思路正确,只是误解了一个问题:“假设ID,CODE是主键,作个内连接”,
不能按照主键做连接,否则就没有意义了(“所有的记录都选出来了”)。
应该是“按照group by的字段列表做连接”,这样使用Max+嵌套查询的结果就实现了
目,并且具有group by的作用。

因此,正确答案是:
select * from test t1 where time = (select max(time) from test
where code =t1.code )
如前面所述,如果group by 更多字段,则要在字查询中对多个字段做连接。
 
到我的问题里回答,无论对错都要给分的,分多分少代表我觉得回答对我的帮助大小。
即使回答的错了,我也给点分,以后每个回答的人都可以随时看看。
这样分数的作用除了游戏外,还可以共同提高。
不过这次一刀的分就不要给我了(如果你试验对的话)。
我把回答贴走。
 
>>即使回答的错了,我也给点分
那是你的习惯,但我不同意这种做法。

>>这样分数的作用除了游戏外,还可以共同提高
看了问题和解答就是提高,和得分有什么关系?

其实关键问题都不在这里,“见者有份”的做法只能鼓励灌水,
现在大家都已经发现水太多成了大富翁的最大隐患。
咱们在论坛上都已经很熟了,因此无所谓,也不会随便去乱写,
可是你看有那么多人毫无意义地去灌水,根本原因就是一个 -- 为了分数。
 

Similar threads

D
回复
0
查看
802
DelphiTeacher的专栏
D
D
回复
0
查看
747
DelphiTeacher的专栏
D
D
回复
0
查看
696
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部