请教码农大师,有个SQL查询不会,虚心请教

  • 小猪快跑
    在数据库的某表中有个数据表 其中两列 列名分别是F1、F2

    都储存了一堆数据
    用F1-F2
    得到一堆差值
    这些差值有个特点 就是+-+-+++----这样的无序分布

    现在是想用sql把这堆分布搞成+-+-+-+-+-这样的

    请问大师如何写这个sql语句

    我用的C# 如果C#能实现也可以

    祭扫伺候
  • 小猪快跑
    就是把+++++++---的第一个+提出来
    再把第一个-提出来
    搞成+-

    如+-+-+++++-------++-----++----
    搞成
    +-+-+-+-+-
  • e
    exquo
    然后第二个+-、第三个+-这么连下去?
  • d
    dzefone
    数据要按+-+-入库还是只是显示?
    如果你对数据库的需求只是查询,后面的计算和展示是数据处理部分
    那就按2楼的方案,两个一维数组一个+一个-,各取一个然后下标+1
    如果对库里数据整体这么排,那就二维数组,多记录个原始数据,再写一个新表
  • 小猪快跑
    是啊 就是这个意思
  • 小猪快跑
    需要结果显示 然后写到数据库

    大哥 你说的这个一维 二维数组的 我不懂啊 能举个例子吗。。。。。
  • 小猪快跑
    其实就是股票里的金叉死叉
    金叉就标记一下
    死叉也标记一下

    我是这样理解的
  • r
    roto
    我操,我想出来怎么写了
    写2个子查询,一个只查+,一个只查-,每个子查询多写一个计算列作为排序标志比如叫sortflag,一个放1、3、5、7、9奇数,一个放2、4、6、8、10偶数,把这2个子查询的结果集union起来,order by sortflag,就是你要的结果了
  • 小猪快跑
    比如+++----+++
    查询+后是++++++
    这6个对应sortflog是123579
    是这个意思不?

    还是
    +++---+++
    对应的sortflog是111222333
  • r
    roto
    查询+的子查询,sortflag放13579
    查询-的子查询,sortflag放26810
    这样2个结果集合在一起,用sortflag排序,不就出来+-+-+-+-的效果了吗
    sortflag的值看你的数据库啥类型的了,用行号*2-1和行号*2就能实现
  • s
    septem776
    只要求+-间隔不要求顺序?那sql查询结果order by F1-F2存到数组a,然后取a[0],a[n-1],a[1],a[n-2]....依次类推
  • e
    exquo
    正解
    可以用row_number() over (order by abs(F1-F2) desc)获得sortflag

    [本帖最后由 exquo 于 2020-11-19 14:34 编辑]
  • d
    darkgame
    这是作业题吧
  • 小猪快跑
    我没说明白
    是这样的+++++-----
    只提第一个+和第一个- 得到+-
    并不是把+++++-----排成+-+-+-+-+-
  • 小猪快跑
    不是。。。。。

    我也是第一次遇到。。。。
  • d
    dboy99

    修正一下

    [本帖最后由 dboy99 于 2020-11-19 14:44 编辑]
  • o
    ooooo84
    row_number() over (partition by 分区字段 order by 排序字段) as rownum
    查询条件加上
    where rownum < 3
  • z
    zfz4869
    楼主语文不大好啊,如果是只取连续值的第一个值,那就是第三种方法。

    def one_by_one(array):
    plus_array = [i for i in array if i > 0]
    minus_array = [i for i in array if i < 0]
    for n,i in enumerate(minus_array):
    plus_array.insert(n*2+1,i)
    return plus_array

    def group_by_sum(array):
    new_array = []
    for k,v in groupby(array,key=lambda x:x>0):
    new_array.append(sum(list(v)))
    return new_array

    def only_first(array):
    new_array = []
    for k,v in groupby(array,key=lambda x:x>0):
    new_array.append(list(v)[0])
    return new_array
  • 小猪快跑
    说row_number附近语法错误 需要over关键字
  • s
    somesun
    不错,这个应该就是lz要的
  • 保密
    这也太简单了,partition by diff得到rn,再select order by rn和diff的type就可以啦。