大家好,情况是这样的,比如有这样一个表分别为ID,DATETIME,Value,分表是编号,日期,数值,日期为日期型
例如数据是这样的:
    1     2009-5-1 12:41:08    200
   1     2009-5-1 13:23:08    100
   1     2009-5-1 15:42:08    300
   1     2009-5-2 9:41:08     400
   1     2009-5-2 14:12:08    350
   1     2009-5-3 17:41:08    900我想查询每天Value的最大值,需要查询出来的结果是:   1     2009-5-1 15:42:08    300
   1     2009-5-2 9:41:08     400
   1     2009-5-3 17:41:08    900不知如何实现比较好呢?在网上也看了有个差不多的例子,按照下面的语句,是可以查询到最大值了,但是日期那里只有日期没有时间,那样也不是行啊,网上的语句是这样的:SELECT     CONVERT(CHAR(8), datetime, 112) AS 日期, MAX(Value) AS 最大值
FROM         Table
WHERE     (id = 1)
GROUP BY CONVERT(CHAR(8), datetime, 112)
ORDER BY 日期这样结果是:
   1     2009-5-1     300
   1     2009-5-2     400
   1     2009-5-3     900少了时间也不行啊,所以不知怎样写好点,还请大家指教指教,谢谢   

解决方案 »

  1.   


    凑合着用吧SELECT ID ,DATETIME, VALUE FROM YourTable inner 
    join (select CONVERT(CHAR(8), datetime, 112) AS DT,MAX(Value) AS MV 
    from YourTable where (id = 1) GROUP BY CONVERT(CHAR(8), datetime, 112)) B 
    on CONVERT(CHAR(8), YourTable.datetime, 112) = B.DT
    AND YourTable.VALUE = B.MV
      

  2.   


    select * from tb a 
    where not exists(select 1 from tb where CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value<a.Value)
      

  3.   

    create table #t(date1 datetime,money1 float)insert into #t
    select  '2009-5-1 12:41:08',200 
    union all
    select  '2009-5-1 13:23:08',100 
    union all
    select  '2009-5-1 15:42:08',300 
    union all
    select  '2009-5-2 9:41:08',400 
    union all
    select  '2009-5-2 14:12:08',350 
    union all
    select  '2009-5-3 17:41:08',900 select * from #t
    select convert(varchar(10),date1 ,23),max(money1) from #t 
    group by convert(varchar(10),date1 ,23)/*
    2009-05-01 300.0
    2009-05-02 400.0
    2009-05-03 900.0
    */
      

  4.   

    CONVERT (data_type[(length)], expression [, style])参数
    expression是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。 data_type目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。 lengthnchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 style日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。可参考sql server联机丛书索引CONVERT。
      

  5.   


    select a.id,a.daytime,a.value from test_t1 a
    join
    (SELECT    CONVERT(CHAR(10), daytime, 120) AS 日期, MAX(Value) AS 最大值 
    FROM        test_t1 
    WHERE    (id = 1) 
    GROUP BY CONVERT(CHAR(10), daytime, 120)) b
    on (CONVERT(CHAR(10), a.daytime, 120)=b.日期 and a.value=b.最大值)1 2009-05-01 15:42:08.000 300.00
    1 2009-05-02 09:41:08.000 400.00
    1 2009-05-03 17:41:08.000 900.00
      

  6.   

    谢谢大家的回答啊,早上把语句试试,发现只有zxf_feng兄的语句可以差不多查询到啊,但是也还是有点问题啊
    比如我id=1了,但是查询出来的结果会有id=2的数值啊,不知道为什么呢,我的id是int型的在数据库里面,还有就是每天的最大值,如果一天中有两个一样大的值,那样就会查询出来2条记录,而我希望一条就可以了,不知怎样写好呢,谢谢dinoalex兄的语句查询出来一条记录都没有啊ks_reny 兄的语句查询的不是最大值的啊daring1981 兄的语句看不懂啊请大家指教指教
      

  7.   

    select a.id,max(a.daytime),a.value from test_t1 a 
    join 
    (SELECT    CONVERT(CHAR(10), daytime, 120) AS 日期, MAX(Value) AS 最大值 
    FROM        test_t1 
    WHERE    (id = 1) 
    GROUP BY CONVERT(CHAR(10), daytime, 120)) b 
    on (CONVERT(CHAR(10), a.daytime, 120)=b.日期 and a.value=b.最大值) 
    group by a.id,a.value
    select max(a.id),max(a.daytime),a.value from test_t1 a 
    join 
    (SELECT    CONVERT(CHAR(10), daytime, 120) AS 日期, MAX(Value) AS 最大值 
    FROM        test_t1 
    WHERE    (id = 1) 
    GROUP BY CONVERT(CHAR(10), daytime, 120)) b 
    on (CONVERT(CHAR(10), a.daytime, 120)=b.日期 and a.value=b.最大值) 
    group by a.value 
      

  8.   

    不好意思,我弄反了select * from tb a 
    where not exists(select 1 from tb where CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value>a.Value)
      

  9.   

    谢谢楼上兄台的回答,但是可能理解错了我的意思啦,我的意思是每个id,每天记录的最大值啊,我列举了自由id=1,还有其他的id,我试了这样查询不行啊,还想请教请教
      

  10.   

    你給的測試數據讓人產生歧義了. 那改為下麵的試試select * from tb a 
    where not exists(select 1 from tb where  id= a.id and CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value>a.Value)上面的語句的意思是在tb中,同一id,同一CONVERT(CHAR(8), datetime, 112)(即同一天) 找最大的value 
      

  11.   

    //方法有好多,只想了几个,不包括MSSQL2005中的方法Create Table tb(id int,dt datetime,val int)
    insert into tb values(1,'2009-5-1 12:41:08', 200)
    insert into tb values(1,'2009-5-1 13:23:08', 100)
    insert into tb values(1,'2009-5-1 15:42:08', 300)
    insert into tb values(1,'2009-5-2 9:41:08 ', 400)
    insert into tb values(1,'2009-5-2 14:12:08', 350)
    insert into tb values(1,'2009-5-3 17:41:08',900) 
    --方法1:
    select a.* from tb a where val = (select max(val) from tb where convert(varchar(10),dt,120) = convert(varchar(10),a.dt,120)) order by a.dt
    --方法2:
    select a.* from tb a where not exists(select 1 from tb where convert(varchar(10),dt,120) = convert(varchar(10),a.dt,120) and val > a.val)
    --方法3:
    select a.* from tb a where 1 > (select count(*) from tb where convert(varchar(10),dt,120) = convert(varchar(10),a.dt,120) and val > a.val ) order by a.dt
      

  12.   

    最根本是掌握相关子查询!
    以前经常用这个,比较易理解 select a.* from tb a where val = (select top 1 val from tb where convert(varchar(10),dt,120) = convert(varchar(10),a.dt,120)) order by a.dt
      

  13.   

    select * from tb a 
    where not exists(select 1 from tb where CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value>a.Value)
      

  14.   

    SELECT    CONVERT(CHAR(8), datetime, 113) AS 日期, MAX(Value) AS 最大值 
    FROM        Table 
    WHERE    (id = 1) 
    GROUP BY CONVERT(CHAR(8), datetime, 113) 
    ORDER BY 日期 
      

  15.   

    汗~~ 怎么会没有呢? 我都查询过了,结果集正是你要想的,你是不是照帖吖??把YourTable替换成你的表名就行了!
      

  16.   

    SELECT datetime, MAX(Value) FROM Table 
    GROUP BY CONVERT(CHAR(8), datetime, 112) 
    ORDER BY 日期 
      

  17.   

    SELECT datetime, MAX(Value) as value FROM Table 
    GROUP BY CONVERT(CHAR(8), datetime, 112) 
    ORDER BY 日期 
      

  18.   

    哦,你们好,我用的是sql server 2005啊,没有说明不好意思,跟这个有没有关系呢?谢谢,我先试试上面的方法啊,谢谢
      

  19.   


    //说实话,以前N层楼的代码都没有考虑到一天内有N个重复的value,解决这个的办法在sql2k中也只能用临时表+唯一标识
    //如果用mssql2005,那太方便了,用row_number() over即可,效果类似于mssql2k中生成带ID的临时表,而后进行筛选!
    //即使val有重复值也能被处理为单值!
    select id,dt,val from
    (
      select * , px = row_number() over(order by dt , val) from tb
    ) m where px = (select min(px) from
    (
      select * , px = row_number() over(order by dt , val) from tb
    ) n where datediff(day,m.dt,n.dt)=0)
      

  20.   


    sqlserver2005也支持over这种写法了,和oracle的类似了
      

  21.   

    大家好,是不是跟我sql server2005有关系呢,我重新测试了上面的代码duck04551 兄的代码会提示datetime没有在group by 字句里面,查询错误
    xiaoxian251 兄的跟我首帖哪里是一样的,查询出来只有日期没有时间ks_reny 兄和smile_ps 兄那条的基本上可以查询出来数据了,我加了个id=多少的条件,如下:
    SELECT     id, datetime, value
    FROM         Table_EnergyTime AS a
    WHERE     (id = 6) AND (NOT EXISTS
                              (SELECT     1 AS Expr1
                                FROM          Table_EnergyTime
                                WHERE      (id = 6) AND (CONVERT(CHAR(8), a.datetime, 112) = CONVERT(CHAR(8), datetime, 112)) AND (value > a.value)))
    这个条件基本上查询出来了,但是对这个语句不是很了解,有个这样的情况,比如value在一天中有两个一样的值,那样上面查询会出现2条记录啊,而我就需要一条就可以了,不知怎么改改好呢?谢谢
    liangpei2008 兄最后那个比较好理解的句子在查询id=1的时候也是可以的,但是如果查询id=2好像就不行啊,谢谢楼上各位的回答,很接近答案啦,谢谢大家