**********如何求数据的最大值*********

yaj52125 2017-10-23 11:32:39
有三个字段

Name    ,   Date   ,   Val
名字           日期       数值


现在想求一组这样的结果:

按照Name分组,取数值Val的最大值,但需要排除一些异常的最大值。。。
排除方法:当前最大值Val,分别与前一日期,后一日期的val值对比,
比如:| val - beforeVal | < 10  and  | afterVal - val |  <10
...全文
240 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
上面有个地方要改下 (b.val-a.val)<10 ==> abs(b.val-a.val)<10
  • 打赏
  • 举报
回复
楼上这个写法是不是把VAL 值 200 和 100 这之后两行都排除范围了 引用楼上数据 注:前提每个name 第一行不是 异常大值
--> --> 中国风(Roy)生成測試數據
if not object_id(N'Tempdb..#1') is null
    drop table #1
Go
Create table #1([Name] nvarchar(22),[Date] Date,[Val] int)
Insert #1
select N'W1','2011/01/01',20 union all
select N'W1','2011/01/02',200 union all
select N'W1','2011/01/03',25 union all
select N'W1','2011/01/04',100 union all
select N'W1','2011/01/05',20 union all
select N'W1','2011/01/06',15 union all
select N'W2','2011/01/01',10 union all
select N'W2','2011/01/02',15 union all
select N'W2','2011/01/03',200 union all
select N'W2','2011/01/04',100 union all
select N'W2','2011/01/05',20 union all
select N'W2','2011/01/06',150
Go
;with t as
	(select name,date,val from #1 a 
	where not exists(select 1 from #1 b where a.Name =b.name and a.Date >b.Date)
	)
,a as
	(select *,1 ck from t
	union all 
	select 
			a.name
			,b.date
			,case when (b.val-a.val)<10 then b.val else a.val end
			,case when (b.val-a.val)<10 then 1 else 0 end
		from a,#1 b 
		where b.Name =a.Name and b.Date =dateadd(d,1,a.date)
	)
select name,max(val)maxV from a where ck=1 group by name
/*
name	maxV
W1	25
W2	20
*/
中国风 2017-10-23
  • 打赏
  • 举报
回复
只需同前一个值比较就行了 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#1') is null
	drop table #1
Go
Create table #1([Name] nvarchar(22),[Date] Date,[Val] int)
Insert #1
select N'W1','2011/01/01',10 union all
select N'W1','2011/01/02',200 union all
select N'W1','2011/01/03',15 union all
select N'W1','2011/01/04',100 union all
select N'W1','2011/01/05',20 union all
select N'W1','2011/01/06',15
Go
SELECT  [Name],[Val]=MAX([Val])
FROM    ( SELECT    * ,
                    beforeVal = LAG(Val) OVER ( PARTITION BY Name ORDER BY Date ) 	--同一个Name前一个值
          FROM      #1
        ) AS T
WHERE   Val - ISNULL(beforeVal, Val) < 10
GROUP BY [Name]
/*
Name	Val
W1	20
*/
  • 打赏
  • 举报
回复
可以先排个序 取中间位置那个数为基准 上下范围10
yaj52125 2017-10-23
  • 打赏
  • 举报
回复
Name Date Val W1 2011/01/01 10 W1 2011/01/02 200 W1 2011/01/03 15 W1 2011/01/04 100 W1 2011/01/05 20 W1 2011/01/06 15 现在列举一组,实际分组很多,红色行需要排除,然后取最大值 这样的数据需要重复去判断 结果 Name Val W1 20
吉普赛的歌 2017-10-23
  • 打赏
  • 举报
回复
不太明白, 请列出 demo 数据和期望的结果

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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