【问题标题】:setting new column values per group based on condition in sql根据 sql 中的条件为每组设置新的列值
【发布时间】:2019-02-27 18:27:39
【问题描述】:

我最近开始使用 sql,我正在处理一个有 3 列的表。表格如下:

| indv | number | flag |
|:----:|:------:|:----:|
| 2477 |  7612  |   1  |
| 2477 |  7850  |   0  |
| 2477 |  7862  |   0  |
| 2477 |  7952  |   1  |
| 2477 |  8150  |   0  |
| 2477 |  8280  |   0  |
| 2477 |  8301  |   1  |
| 2560 |  7612  |   0  |
| 2560 |  7850  |   0  |
| 2560 |  7862  |   0  |
| 2877 |  3422  |   1  |
| 2877 |  3423  |   1  |
| 2877 | 5612   |  1   |
| 2877 | 6123   |  1   |

我想编写一个查询,该查询根据标志中的 indv 值和值分组创建一个新列。例如,对于组 2477,如果组中的每个条目的标志为 0,则其值等于默认编号(假设为 10000),但如果标志为 1,则其值等于组的第一个值。但是,如果 2 个连续标志 = 1 的数字之间的差异大于 50,则 number1 列的值必须对应于数字列中最新的 flag=1 值。它可能看起来令人困惑,因此还提供了一个示例输出:

| indv | number | flag | number1 |
|:----:|:------:|:----:|---------|
| 2477 |  7612  |   1  | 7612    |
| 2477 |  7850  |   0  | 7612    |
| 2477 |  7862  |   0  | 7612    |
| 2477 |  7952  |   1  | 7952    |
| 2477 |  8150  |   0  | 7952    |
| 2477 |  8280  |   0  | 7952    |
| 2477 |  8301  |   1  | 8301    |
| 2560 |  7612  |   0  | 10000   |
| 2560 |  7850  |   0  | 10000   |
| 2560 |  7862  |   0  | 10000   |
| 2877 |  3422  |   1  | 3422    |
| 2877 |  3423  |   1  | 3422    |
| 2877 | 5612   |  1   | 5612    |
| 2877 | 6123   |  1   | 6123    |  

【问题讨论】:

  • 请不要使用不适用于您的问题的标签。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请添加only你实际使用的数据库的标签
  • 感谢您的编辑,约翰。将在以后的问题中处理它。

标签: sql group-by subquery


【解决方案1】:

您可以使用相关子查询:

select t.*,
       coalesce((select t1.number
                 from table t1 
                 where t1.indv = t.indv and t1.number <= t.number and t1.flag = 1 
                 order by t1.number desc
                 limit 1
                ), 10000
               ) as number1
from table t; 

不同的数据库有不同的风格来限制行,因此您需要相应地更改subquery

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多