一个思考很久的问题,不知道怎么解决(sql语句) ( 积分: 50 )

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

superzls

Unregistered / Unconfirmed
GUEST, unregistred user!
这里一张表结构&nbsp;table<br>单位编号 产品编号 日期 备注<br>001 cp001 2007/07/01 &nbsp;&nbsp;13<br>001 cp001 2007/07/02 &nbsp;&nbsp;5<br>001 cp001 2007/07/10 &nbsp;&nbsp;7<br>002 cp002 2007/07/09 &nbsp;&nbsp;7<br>002 cp001 2007/07/01&nbsp;&nbsp;&nbsp;8<br>002 cp002 2007/07/11&nbsp;&nbsp;&nbsp;9<br>003 cp001 2007/07/02 &nbsp;&nbsp;3<br><br>我想用sql实现如下所示<br> 结果<br>单位编号 产品编号 日期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;备注 <br>001 cp001 2007/07/10 &nbsp;&nbsp;7<br>002 cp001 2007/07/01 &nbsp;&nbsp;8<br>002 cp002 2007/07/11 &nbsp;&nbsp;9<br>003 cp001 2007/07/02 &nbsp;&nbsp;3<br>说明一下,就是选出&nbsp;该单位,该产品,日期是最大的记录<br>因为这里要保留备注,所以就不知道怎么处理了<br><br>假如去掉备注的话,实现是没问题的<br>select&nbsp;单位编号,产品编号,max(日期)<br>from&nbsp;table<br>group&nbsp;by&nbsp;&nbsp;单位编号,产品编号<br><br><br>请问,假如我把这个备注加上去,这个该怎么实现&nbsp;?
 
select&nbsp;a.*<br>from&nbsp;table&nbsp;a,<br>(select&nbsp;单位编号,产品编号,max(日期)&nbsp;as&nbsp;日期<br>from&nbsp;table<br>group&nbsp;by&nbsp;&nbsp;单位编号,产品编号)&nbsp;as&nbsp;b<br>where&nbsp;a.单位编号=b.单位编号&nbsp;and&nbsp;a.产品编号=b.产品编号&nbsp;and&nbsp;a.日期=b.日期
 
Select&nbsp;a.*,&nbsp;Table.备注<br>From&nbsp;(select&nbsp;单位编号,产品编号,max(日期)&nbsp;as&nbsp;日期&nbsp;from&nbsp;table&nbsp;group&nbsp;by&nbsp;&nbsp;单位编号,产品编号)&nbsp;a&nbsp;left&nbsp;join&nbsp;Table&nbsp;on&nbsp;a.产品编号&nbsp;=&nbsp;Table.产品编号&nbsp;And&nbsp;a.日期&nbsp;=&nbsp;Table.日期
 
如果不巧有两个max(日期),备注怎么处理?
 
(select&nbsp;单位编号,产品编号,max(日期)&nbsp;as&nbsp;日期&nbsp;<br>from&nbsp;table&nbsp;<br>group&nbsp;by&nbsp;&nbsp;单位编号,产品编号)&nbsp;AS&nbsp;TEMP<br>LEFT&nbsp;OUTER&nbsp;JOIN<br>TABLE&nbsp;ON&nbsp;TEMP.单位编号=&nbsp;Table.单位编号&nbsp;and&nbsp;TEMP.产品编号&nbsp;=&nbsp;Table.产品编号&nbsp;And&nbsp;TEMP.日期&nbsp;=&nbsp;Table.日期
 
SELECT&nbsp;TEMP.*.Table.备注&nbsp;<br>FROM&nbsp;(select&nbsp;单位编号,产品编号,max(日期)&nbsp;as&nbsp;日期&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;table&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;by&nbsp;&nbsp;单位编号,产品编号)&nbsp;AS&nbsp;TEMP<br>LEFT&nbsp;OUTER&nbsp;JOIN<br>TABLE&nbsp;ON&nbsp;TEMP.单位编号=&nbsp;Table.单位编号&nbsp;and&nbsp;TEMP.产品编号&nbsp;=&nbsp;Table.产品编号&nbsp;And&nbsp;TEMP.日期&nbsp;=&nbsp;Table.日期
 
关注下.............
 
谢谢大家,谢谢大家<br><br>来自:kingsonchan,&nbsp;时间:2007-7-11&nbsp;17:24:18,&nbsp;ID:3809542<br>如果不巧有两个max(日期),备注怎么处理?<br><br>是的,刚刚我没考虑到,现在我在原表后面加个字段如&nbsp;录入时间(lrtime),我可以使这个时间不存在相同的情况
 
SELECT&nbsp;TEMP.*.Table.备注&nbsp;<br>FROM&nbsp;(select&nbsp;单位编号,产品编号,max(日期)&nbsp;as&nbsp;日期&nbsp;,max(录入时间)as录入时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;table&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;by&nbsp;&nbsp;单位编号,产品编号)&nbsp;AS&nbsp;TEMP<br>LEFT&nbsp;OUTER&nbsp;JOIN<br>TABLE&nbsp;ON&nbsp;TEMP.单位编号=&nbsp;Table.单位编号&nbsp;and&nbsp;TEMP.产品编号&nbsp;=&nbsp;Table.产品编号&nbsp;And&nbsp;TEMP.日期&nbsp;=&nbsp;Table.日期&nbsp;and&nbsp;table.录入时间=temp.录入时间<br><br><br>请问这个语句实现有没有问题,欢迎大家多多指出
 
select&nbsp;单位编号,产品编号,备注,max(日期)<br>from&nbsp;table<br>group&nbsp;by&nbsp;&nbsp;单位编号,产品编号,备注
 
TABLE&nbsp;ON&nbsp;TEMP.单位编号=&nbsp;Table.单位编号&nbsp;and&nbsp;TEMP.产品编号&nbsp;=&nbsp;Table.产品编号&nbsp;And&nbsp;TEMP.日期&nbsp;=&nbsp;Table.日期&nbsp;and&nbsp;table.录入时间=temp.录入时间<br><br>以上语句将会返回空白的信息,即无结果,因为没有可能或必要这么多的统一绑定!<br>主要以一个做主键连接便可以了!
 
在多用戶情況下录入时间也可能一樣。
 
對多日期處理:先&nbsp;Select&nbsp;Identity(Int,1,1)&nbsp;as&nbsp;Seq,*&nbsp;Into&nbsp;#Tmp...&nbsp;Order&nbsp;By&nbsp;Date&nbsp;Desc,再取Max(Seq),即可
 
谢谢大家
 
SELECT&nbsp;*,<br>&nbsp;&nbsp;(SELECT&nbsp;top&nbsp;1&nbsp;备注&nbsp;from&nbsp;table&nbsp;where&nbsp;(单位编号=a.单位编号)&nbsp;and&nbsp;(产品编号=a.产品编号)&nbsp;and&nbsp;(日期=a.日期))&nbsp;as&nbsp;备注,<br>&nbsp;&nbsp;(SELECT&nbsp;top&nbsp;1&nbsp;录入时间&nbsp;from&nbsp;table&nbsp;where&nbsp;(单位编号=a.单位编号)&nbsp;and&nbsp;(产品编号=a.产品编号)&nbsp;and&nbsp;(日期=a.日期))&nbsp;as&nbsp;录入时间,<br>FROM&nbsp;(<br>&nbsp;&nbsp;select&nbsp;单位编号,产品编号,Max(日期)&nbsp;as&nbsp;日期<br>&nbsp;&nbsp;from&nbsp;table&nbsp;<br>&nbsp;&nbsp;group&nbsp;by&nbsp;单位编号,产品编号<br>&nbsp;&nbsp;)&nbsp;as&nbsp;a
 
学习下。。。。。。。。。。。。[:D]
 
LOOK&nbsp;UP&nbsp;````START&nbsp;STUDY
 
xiaxianshuang基本已经实现功能了吧。group后使用左外连接也没多大必要。个人观点。希望楼主把最后使用方案说一下。
 
后退
顶部