求计算用量的sql,不能用max-min,原因请进

cow8063 2010-01-26 03:27:32
datas 表

userid data rdate
一些数据如下
1 43 2009-10-26 16:10:00
2 34 2009-10-26 16:10:00
1 43 2009-10-26 16:12:00
2 34 2009-10-26 16:12:00
1 342 2009-10-26 16:22:00
2 233 2009-10-26 16:22:00
1 0 2009-11-26 16:10:00
2 0 2009-11-26 16:10:00
1 43 2009-11-26 16:12:00
2 34 2009-11-26 16:12:00
1 324 2009-11-26 16:22:00
2 32 2009-11-26 16:22:00
这个表数据更新很快,几乎每分钟都有数据

现在我想求出2009-10-26至2009-11-26的用量(11-26最晚时间的data-10-26最早时间的data),按理说max(data),min(data),max(data)-min(data),然后group by userid
但在这里不可以这样算,因为data会存在错误的数据,如上面的0等,明显不正确
应该如何改进一下呀
...全文
211 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2010-01-27
  • 打赏
  • 举报
回复
对固定用户(userid),data是否随时间推迟不断变大,data表示什么?
jiangjubo 2010-01-27
  • 打赏
  • 举报
回复
jf
playwarcraft 2010-01-27
  • 打赏
  • 举报
回复
归根到底是,怎样的数据算正常,怎样的数据算异常
难道是靠认为经验判断?
忆轩辕 2010-01-27
  • 打赏
  • 举报
回复
那些异常数据就用where条件过滤掉
bobo_911 2010-01-27
  • 打赏
  • 举报
回复
乱七八糟的 没规律。没办法
feixue_XXXX 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 playwarcraft 的回复:]
归根到底是,怎样的数据算正常,怎样的数据算异常
难道是靠认为经验判断?
[/Quote]

up
黄_瓜 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cow8063 的回复:]
引用 8 楼 beirut 的回复:
引用 7 楼 cow8063 的回复:
就举三条数据,比如吧,
1      43    2009-12-15 10:10:00
1      55555  2010-01-01 09:10:00 //这条数据由于各个原因出错,但是存在的
1      46    2010-01-15 10:12:00
一般语句如下
SQL codeselect userid,max(data)as a,min(data)as b,max(data)-min(data)as cfrom dataswhere  rdatebetween'2009-12-15 10:00:00'and'2010-01-15 10:59:59')groupby userid
这个SQL求出的是55555-43=55512,是错误的

而我应该求出的是46-43=3,这才是正常的

可以考虑手动删除
select data from tb order by data desc
删除异常数据,简单的逻辑怎么能知道那些数据大得离谱呢?

数据量大多,不好删除。谢谢,我考虑取前面和后面一条数据,然后相减算了,要按userid分组,不知这个SQL应该如何写呀
[/Quote]
关键是你一次取多少条才算合适呢?
怎么才能保证不夺取,不漏取呢?
rokerker 2010-01-26
  • 打赏
  • 举报
回复
能不能先把很离谱的数据先去掉,比如为0的数据,比如大于一个数值【55555】的数据,去掉之后再进行你要的计算,就是加个条件限制
select userid,max(data)as a,min(data)as b,max(data)-min(data)as c
from dataswhere rdate between'2009-12-15 10:00:00'and'2010-01-15 10:59:59')
【WHERE data <> 0 AND data < 55555 ......】
group by userid
cow8063 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 beirut 的回复:]
引用 7 楼 cow8063 的回复:
就举三条数据,比如吧,
1      43    2009-12-15 10:10:00
1      55555  2010-01-01 09:10:00 //这条数据由于各个原因出错,但是存在的
1      46    2010-01-15 10:12:00
一般语句如下
SQL codeselect userid,max(data)as a,min(data)as b,max(data)-min(data)as cfrom dataswhere  rdatebetween'2009-12-15 10:00:00'and'2010-01-15 10:59:59')groupby userid
这个SQL求出的是55555-43=55512,是错误的

而我应该求出的是46-43=3,这才是正常的

可以考虑手动删除
select data from tb order by data desc
删除异常数据,简单的逻辑怎么能知道那些数据大得离谱呢?
[/Quote]
数据量大多,不好删除。谢谢,我考虑取前面和后面一条数据,然后相减算了,要按userid分组,不知这个SQL应该如何写呀
黄_瓜 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cow8063 的回复:]
就举三条数据,比如吧,
1      43    2009-12-15 10:10:00
1      55555  2010-01-01 09:10:00 //这条数据由于各个原因出错,但是存在的
1      46    2010-01-15 10:12:00
一般语句如下
SQL codeselect userid,max(data)as a,min(data)as b,max(data)-min(data)as cfrom dataswhere rdatebetween'2009-12-15 10:00:00'and'2010-01-15 10:59:59')groupby userid
这个SQL求出的是55555-43=55512,是错误的

而我应该求出的是46-43=3,这才是正常的
[/Quote]
可以考虑手动删除
select data from tb order by data desc
删除异常数据,简单的逻辑怎么能知道那些数据大得离谱呢?
cow8063 2010-01-26
  • 打赏
  • 举报
回复
就举三条数据,比如吧,
1 43 2009-12-15 10:10:00
1 55555 2010-01-01 09:10:00 //这条数据由于各个原因出错,但是存在的
1 46 2010-01-15 10:12:00
一般语句如下

select userid,max(data) as a,min(data) as b,max(data)- min(data) as c from datas
where rdate between '2009-12-15 10:00:00' and '2010-01-15 10:59:59') group by userid

这个SQL求出的是55555-43=55512,是错误的

而我应该求出的是46-43=3,这才是正常的
Mr_Nice 2010-01-26
  • 打赏
  • 举报
回复
如此杂乱,要先整理数据的。
要整理,肯定要有规则,想要什么样的数据???
cow8063 2010-01-26
  • 打赏
  • 举报
回复
楼上的各位,不一定是0呀,有可能前面的日期读数大于后面的日期读数,有可能是一个数据非常乱,99999999。等等都可能有
winstonbonaparte 2010-01-26
  • 打赏
  • 举报
回复
你把0的排除掉不就可以减了吗
Mr_Nice 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql77 的回复:]
WHERE data <>0 加个条件
[/Quote]

up
SQL77 2010-01-26
  • 打赏
  • 举报
回复
WHERE data <>0 加个条件
--小F-- 2010-01-26
  • 打赏
  • 举报
回复
不明白意思

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧