求助大佬解决测试题

image.png

image.png

第一张是表结构,第二张是查询结果。请问该如何写sql实现这个查询,不能写死要动态的。感谢!!!!

aafighting 发布于 2020-9-3 19:42
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
2
axingLv6专家互助
发布于2020-9-4 09:57
select min(fname) as fmin,max(fname) as fmax,rn,fsex from (
select fname,fsex,row_number() over (order by fname)-row_number() over(partition by fsex order by fname) rn from temp
) t group by fsex,rn order by fmin

rn这列是用来辅助分组的

image.png

  • aafighting aafighting(提问者) 写死的话确实可以,不知道还没有其他适用于开发的方法。
    2020-09-04 13:48 
  • axing axing 回复 aafighting(提问者) 我这个怎么是写死了......
    2020-09-04 14:10 
  • axing axing 回复 aafighting(提问者) 图里with temp as那一大堆是构造一个临时表,真正查询的只有最后那三行sql,没有一丝一毫写死的代码
    2020-09-04 14:15 
  • aafighting aafighting(提问者) 回复 axing 经测试可以用,多谢!!!
    2020-09-04 15:01 
  • jongwang jongwang 厉害了
    2020-09-04 15:23 
最佳回答
0
jongwangLv6中级互助
发布于2020-9-3 20:10

什么数据库


  • aafighting aafighting(提问者) sqlserver 数据库,其他数据库也可以。表是自建的
    2020-09-04 13:49 
最佳回答
0
葛智Lv6初级互助
发布于2020-9-4 08:08

谁能看懂你查询的结果是什么意思?

  • zsh331 zsh331 求连续分组,组内最大最小值,用开窗函数比较好处理,有兴趣的可以试试哟,这个SQL有点小难度。
    2020-09-04 08:17 
最佳回答
0
唱跳rap全能选手Lv7中级互助
发布于2020-9-4 08:33(编辑于 2020-9-4 08:33)

with CteData as (

   /*0)测试数据,可以来自数据库*/

   select 'A01' as FCode, '男' as FGender

   union all

   select 'A02' as FCode, '男' as FGender

   union all

   select 'A03' as FCode, '男' as FGender

   union all

   select 'A04' as FCode, '女' as FGender

   union all

   select 'A05' as FCode, '女' as FGender

   union all

   select 'A06' as FCode, '男' as FGender

   union all

   select 'A07' as FCode, '男' as FGender

   union all

   select 'A08' as FCode, '女' as FGender

), CteAddNo as (

   /*1)数据添加行号*/

   select row_number() over ( order by FCode ) as FNo,

          x.*

   from CteData x

), CteAddGrpNo as (

   /*2)继续添加分组序号*/

   select 1         as FGrpNo,

          x.FNo     as FNo,

          x.FCode   as FCode,

          x.FGender as FGender

   from CteAddNo x

   where x.FNo = 1

   union all

   select iif(c.FGender = d.FGender, c.FGrpNo, c.FGrpNo + 1) as FGrpNo,

          d.FNo                                              as FNo,

          d.FCode                                            as FCode,

          d.FGender                                          as FGender

   from CteAddGrpNo c, CteAddNo d

   where d.FNo = c.FNo + 1

), CteGroup as (

   /*3)按分组序号分组*/

   select min(x.FCode)   as FCode1,

          max(x.FCode)   as FCode2,

          min(x.FGender) as FGender

   from CteAddGrpNo x

   group by x.FGrpNo

)

select *

from CteGroup

sqlserver数据库写的,答案来自其他大佬

  • 4关注人数
  • 605浏览人数
  • 最后回答于:2020-9-4 09:57
    请选择关闭问题的原因
    确定 取消
    返回顶部