大家好,情况是这样的,比如有这样一个表分别为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 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少了时间也不行啊,所以不知怎样写好点,还请大家指教指教,谢谢
解决方案 »
- 急求 override overload的区别
- DBGridEh 主要功能是什么?
- 关于改表的字段值~~
- 关于Delphi WebService是否可以使用Delphi的网络组件如(TIdTCPServer, TSocketServer)与客户端通信并传输文件?
- 播放flash完毕时的触发事件是什么
- 如何获取数据库中数据表的个数和数据表的名称,,,,急
- 在delphi中怎样修改ip地址?
- 一个问题,也是关于打印的,对与熟悉DELPHI的应该很简单,大给分
- 哪位高手救救我吧。。。
- 如何,把查询数据库结果保存成 WORD文档 ?
- cxbutton的黑色边框能去掉吗?
- delphi可以知道Exception异常的详细位置吗?
凑合着用吧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
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)
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
*/
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。
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
比如我id=1了,但是查询出来的结果会有id=2的数值啊,不知道为什么呢,我的id是int型的在数据库里面,还有就是每天的最大值,如果一天中有两个一样大的值,那样就会查询出来2条记录,而我希望一条就可以了,不知怎样写好呢,谢谢dinoalex兄的语句查询出来一条记录都没有啊ks_reny 兄的语句查询的不是最大值的啊daring1981 兄的语句看不懂啊请大家指教指教
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
where not exists(select 1 from tb where CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value>a.Value)
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
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
以前经常用这个,比较易理解 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
where not exists(select 1 from tb where CONVERT(CHAR(8), a.datetime, 112)=CONVERT(CHAR(8), datetime, 112) and Value>a.Value)
FROM Table
WHERE (id = 1)
GROUP BY CONVERT(CHAR(8), datetime, 113)
ORDER BY 日期
GROUP BY CONVERT(CHAR(8), datetime, 112)
ORDER BY 日期
GROUP BY CONVERT(CHAR(8), datetime, 112)
ORDER BY 日期
//说实话,以前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)
sqlserver2005也支持over这种写法了,和oracle的类似了
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好像就不行啊,谢谢楼上各位的回答,很接近答案啦,谢谢大家