按B列相邻分组取A列最大行,并求分组后A的最大最小差,该如何实现呢?

happyhhb 2013-05-06 10:06:23
可能表述有些问题,呵呵
假设有表t如下

f1 f2
1 c
12 a
3 b
11 a
4 b
5 a
2 b
7 c
8 d
9 c
10 c
6 a

我想先按f1排序,如下:

f1 f2
1 c
2 b
3 b
4 b
5 a
6 a
7 c
8 d
9 c
10 c
11 a
12 a

然后按f2相邻分组,也就是连续出现的作为分组,然后求分组后f1最大和最小的差值
结果如下:

f1 f2 sub
1 c 0 --f2相邻分组只有1行,所以为0
4 b 2 --f2相邻分组有3行,都是b,对应f1分别是2、3、4,则f1只留下最大的4,sub = 4-2 = 2
6 a 1 --f2相邻分组有2行,都是a,对应f1分别是5、6,则f1只留下最大的6,sub = 6-5 = 1
7 c 0 --f2相邻分组只有1行,所以为0
8 d 0 --f2相邻分组只有1行,所以为0
10 c 1 --f2相邻分组有2行,都是c,对应f1分别是9、10,则f1只留下最大的10,sub = 10-9 = 1
12 a 1 --f2相邻分组有2行,都是a,对应f1分别是11、12,则f1只留下最大的12,sub = 12-11 = 1

呵呵,不知道表述得是否清楚,貌似挺难的问题,想了蛮久,不知道怎样用简单的sql解决
谢谢各位大大的指教 ^_^
...全文
271 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
PayneYu 2013-05-07
  • 打赏
  • 举报
回复
用分析函数row_number()进行分组排序+model子句进行行间运算,很容易解决
happyhhb 2013-05-06
  • 打赏
  • 举报
回复
谢谢 di74jun,你语句的结果如下:
Expr1000	f2
-5	a
2	b
8	c
0	d
有那么点意思,呵呵,但我想的效果是相邻分组,而且还需要列出f1中的相邻分组后分组中的最大值
dyf0130 2013-05-06
  • 打赏
  • 举报
回复
select max(f1) - min(f1),f2 from t group by f2 是这个意思吧
lily_083593 2013-05-06
  • 打赏
  • 举报
回复
create table a ( f1 int, f2 varchar(10) ) insert into a values(1,'c'), (12,'a'), (3,'b'), (11,'a'), (4,'b'), (5 ,'a'), (2,'b'), (7,'c'), (8,'d'), (9,'c'), (10,'c'), (6,'a' ) with #a as ( SELECT *,ROW_NUMBER() OVER ( ORDER BY row1 )AS ord FROM (select row1 ,F1,F2, isnull(row2,row1+1) as row2, val1 , isnull(val2,'#') as val2 from (SELECT F1 AS F1,ROW_NUMBER() OVER ( ORDER BY f1 )AS row1 , f2 AS val1 FROM a ) t1 LEFT JOIN (SELECT F1 AS F2,ROW_NUMBER() OVER ( ORDER BY f1 ) AS row2 , f2 AS val2 FROM a )t2 ON t1.row1 + 1 = t2.row2 )t where val1<>val2 ) select a.F1, a.val1, isnull(a.F1-b.F2,0) as result from #a a left join #a b on a.ord=b.ord+1 where a.val1<>a.val2
唐诗三百首 2013-05-06
  • 打赏
  • 举报
回复

create table hap
(f1 int, f2 varchar(5))
 
insert into hap
select 22, 'k' union all
select 1, 'c' union all
select 5, 'b' union all
select 11, 'c' union all
select 51, 'a' union all
select 7, 'b' union all
select 8, 'a' union all
select 10, 'a' union all
select 40, 'k' union all
select 17, 'd' union all
select 4, 'b' union all
select 57, 'a' union all
select 44, 'g'


select f1,f2 from hap order by f1
/*
f1          f2
----------- -----
1           c
4           b
5           b
7           b
8           a
10          a
11          c
17          d
22          k
40          k
44          g
51          a
57          a

(13 row(s) affected)
*/


with t0 as
(select f1,f2,row_number() over(order by f1) 'rn' 
 from hap
),
t1 as
(select a.f1,a.f2
 from t0 a
 left join t0 b on a.rn=b.rn-1
 where b.rn is null or a.f2<>b.f2
),
t2 as
(select a.f1,a.f2
 from t0 a
 left join t0 b on a.rn=b.rn+1
 where b.rn is null or a.f2<>b.f2
)
select c.f1,
       c.f2,
       isnull(c.f1-d.f1,0) 'sub' 
 from (select f1,f2,row_number() over(order by f1) 'rn' from t1) c
 left join (select f1,f2,row_number() over(order by f1) 'rn' from t2) d 
 on c.rn=d.rn
 
/*
f1          f2    sub
----------- ----- -----------
1           c     0
7           b     3
10          a     2
11          c     0
17          d     0
40          k     18
44          g     0
57          a     6

(8 row(s) affected)
*/
happyhhb 2013-05-06
  • 打赏
  • 举报
回复
谢谢 ap0405140,请问如果f1并不是序列规律递增的,而是不规律递增的,“a.f1=b.f1-1”也许就不适用了,比如f1是精确到秒的时间字符串,因此还想问问,假设是下表这样的情况该怎么办呢?
f1    f2
22    k
1      c
5      b
11    c
51    a
7      b
8      a
10    a
40    k
17    d
4      b
57    a
44    g
按f1排序后结果如下:此时除了f1是因为排序不规律递增的,f2并没有什么规律可言
f1    f2
1     c
4     b
5     b
7     b
8     a
10   a
11   c
17   d
22   k
40   k
44   g
51   a
57   a
然后按f2相邻分组,也就是连续出现的作为分组,然后求分组后f1最大和最小的差值 结果如下:
f1    f2    sub
1     c      0     --f2相邻分组只有1行,所以为0
7     b     3     --f2相邻分组有3行,都是b,对应f1分别是4、5、7,则f1只留下最大的7,sub = 7-4 = 3
10   a     2     --f2相邻分组有2行,都是a,对应f1分别是10、8,则f1只留下最大的10,sub = 10-8 = 2
11   c     0     --f2相邻分组只有1行,所以为0
17   d     0     --f2相邻分组只有1行,所以为0
40   k     18    --f2相邻分组有2行,都是k,对应f1分别是22、40,则f1只留下最大的40,sub = 40-22 = 18        
44   g     0     --f2相邻分组只有1行,所以为0
57   a     6     --f2相邻分组有2行,都是a,对应f1分别是51、57,则f1只留下最大的57,sub = 57-51 = 6
貌似更麻烦了,呵呵,没办法,这比较接近我真实要做的案例,确实让人想破头了 谢谢各位指教 ^_^
唐诗三百首 2013-05-06
  • 打赏
  • 举报
回复

create table hap
(f1 int, f2 varchar(5))

insert into hap
select 1, 'c' union all
select 12, 'a' union all
select 3, 'b' union all
select 11, 'a' union all
select 4, 'b' union all
select 5, 'a' union all
select 2, 'b' union all
select 7, 'c' union all
select 8, 'd' union all
select 9, 'c' union all
select 10, 'c' union all
select 6, 'a'


with t1 as
(select a.f1,
        a.f2
 from hap a
 left join hap b on a.f1=b.f1-1
 where b.f1 is null or a.f2<>b.f2
),
t2 as
(select f1,f2,row_number() over(order by f1) 'rn' 
 from t1
)
select c.f1,
       c.f2,
       isnull(c.f1-d.f1-1,0) 'sub'
 from t2 c
 left join t2 d on c.rn=d.rn+1

/*
f1          f2    sub
----------- ----- -----------
1           c     0
4           b     2
6           a     1
7           c     0
8           d     0
10          c     1
12          a     1

(7 row(s) affected)
*/
内容概要:本文详细介绍了MySQL中InnoDB存储引擎的逻辑存储结构及其表分区技术。InnoDB的逻辑存储单元由高到低依次为表空间、段、区、页和,其中表空间包括系统表空间、独立表空间、通用表空间、Undo表空间和临时表空间,每种表空间具有不同的用途和管理方式。文章进一步讲解了表分区的概念与类型,包括RANGE、LIST、HASH、KEY以及多字段COLUMNS分区,阐述了分区的优势如提升查询性能、便于数据维护、支持跨物理设备存储等,并举了实际SQL操作示例,帮助理解分区表的创建、修改、删除及重组等操作。同时指出了分区的限制条件,如最大分区数量、主键约束要求等。; 适合人群:具备一定MySQL数据库基础,从事数据库开发、运维或架构设计的技术人员,尤其是工作中涉及大数据量表管理与性能优化的1-3年经验研发人员。; 使用场景及目标:①深入理解InnoDB存储机制,优化数据库物理结构设计;②掌握表分区技术,应用于海量数据存储与高效查询场景,如日志系统、订单系统的时间分区设计;③通过分区实现数据归档、快速删除历史数据、提升查询性能等运维目标; 阅读建议:学习时应结合MySQL实际环境动手实践文中提供的SQL命令,重点关注表空间管理和分区策略的选择,理解其对性能和维护的影响,并注意分区使用中的限制条件以避免设计失误。
内容概要:本文系统介绍了GitHub Copilot的实战使用技巧,涵盖其核心功能、提示工程、上下文管理、自定义配置及常见误区。文章强调Copilot不仅是代码补全工具,更是覆盖软件开发全生命周期的AI编程助手,重点讲解如何通过上下文工程、提示词结构化、斜杠命令与聊天参与者等方式提升代码生成质量,并结合实战案例展示在测试生成、代码重构、调试、文档编写等场景中的高效应用。同时指出Copilot的局限性,倡导“人为主导、AI辅助”的协作模式,强调代码审查与安全合规的重要性。; 适合人群:具备一定编程经验,希望提升开发效率的个人开发者、团队工程师及技术管理者,尤其是正在使用或计划引入AI编程工具的研发人员。; 使用场景及目标:①掌握Copilot在测试生成、代码解释、重构优化、调试排错等方面的高级用法;②学会构建高质量提示词与自定义指令,使AI输出更贴合项目规范;③规避常见使用陷阱,实现安全、可控、高效的AI辅助开发。; 阅读建议:此文档兼具理论指导与实操示范,建议结合实际开发环境边学边练,重点关注提示工程、上下文管理与自定义指令配置,持续迭代优化使用方式,并在团队中建立统一的AI编码规范与审查机制。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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