【问题标题】:Replace Specific values to SQL Rows and Randomly Distribute them将特定值替换为 SQL 行并随机分布它们
【发布时间】:2020-05-23 20:31:42
【问题描述】:
|Value|
|7.5  |
|9    |
|15.5  |
|12.5 |
|6.5  |
|9    |

表格有很多数值。我想将所有有 9 的行更改为 8.5 和 10.5。如果 9 有 8 个值,那么 8.5 和 10.5 应该相等且随机插入

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题:mysql、postgresql、oracle...?
  • 如果 9 有 7 个值呢?我假设您要平均分配 value = 9 的记录总数的两个值,但是在 value=9 的记录数为奇数的情况下,哪个输出值赢得更多记录?还是没关系?
  • 没关系。只是不希望 8.5 和 10.5 之一的值太多

标签: sql postgresql select window-functions


【解决方案1】:

你可以使用窗口函数:

select
    value,
    case rn % 2
        when 0 then 8.5
        when 1 then 10.5
        else value
    end new_value
from (
    select 
        value,
        case when value = 8 
            then row_number() over(partition by value order by rand()) 
        end rn
    from mytable
) t

内部查询随机排列具有值 8 的记录 - 请注意 order by rand() 语法在数据库之间不一致(例如,它由 MySQL 支持,而 SQLServer 需要 order by newid())。

外部查询分配新值:偶数排名得到值8.5,不均匀排名得到10.5

子查询实际上只是为了缩短外部查询中的语法,但并非绝对必要:

select
    value,
    case 
        when value = 8 and row_number() over(partition by value order by rand()) % 2 = 0 
            then 8.5
        when value = 8 
            then 10.5
        else value
    end new_value
from mytable

【讨论】:

  • 非常感谢!我们还需要添加一个else value 语句来将我们想要的其他值复制到主表中。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2012-03-19
  • 2019-03-15
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多