mysql sql更新最大值(日期)分组依据

flvlnr44  于 2022-12-17  发布在  Mysql
关注(0)|答案(2)|浏览(130)
  • n.原始数据

| 没有|群|日期|价值|旗|
| - ------|- ------|- ------|- ------|- ------|
| 1个|一个|二〇二二年十月十三日|旧的|Y型|
| 第二章|一个|二〇二二年十月十五日|新的|Y型|
| 三个|B| 2022年1月1日|旧的|数量|
| 四个|B| 2022年1月3日|新的|数量|

  • 步骤1.插入1号原始数据
  • 步骤2.修改no2原始数据使用日期值

我想更新no2 raw使用的最新日期no1 raw,条件是whereflag= "y"

  • 最终sql表

| 没有|群|日期|价值|旗|
| - ------|- ------|- ------|- ------|- ------|
| 1个|一个|二〇二二年十月十五日|旧的|Y型|
| 三个|B| 2022年1月1日|旧的|数量|
这可能吗?
+)我逐行插入/更新原始数据。

3pmvbmvn

3pmvbmvn1#

不完全清楚,但我希望下面的答案给你一个提示,如果不是解决方案。

select  no,
       `group`,
        case when flag='Y' then mx_dt else `date` end as new_date,
        value,
        flag
from (    select no,
                 `group`,
                  value,
                  `date`,
                  flag ,
                  row_number() over(partition by `group` order by `date` asc ) as rn,
                  max(`date`) over (partition by `group`,(case when flag  <> 'Y' then `date`  end)   ) mx_dt
          from raw_data
    ) as tbl
where rn=1;

如果标志=Y,则上述代码将选择每组的最大值(日期),否则将采用每行的日期。
https://dbfiddle.uk/JhRUti2h

ijnw1ujt

ijnw1ujt2#

解决方案是自联接源表并选择正确的字段,优先考虑最新日期。
下面是一个工作查询:

WITH source_data AS (
SELECT 1 AS no_,  'a' AS group_, CAST('2022-10-13' AS DATE) AS date, 'old' AS value, 'y' AS flag
UNION ALL
SELECT 2, 'a', CAST('2022-10-15' AS DATE), 'new', 'y'
UNION ALL
SELECT 3, 'b', CAST('2022-01-01' AS DATE), 'old', 'n'
UNION ALL
SELECT 4, 'b', CAST('2022-01-03' AS DATE), 'new', 'n')

SELECT no_, group_, COALESCE(new_date, date), value, flag
FROM 
(SELECT * FROM source_data WHERE value = 'old') old_values
LEFT JOIN (SELECT group_ AS new_group, date AS new_date FROM source_data WHERE value = 'new' AND flag='y') new_values
ON old_values.group_ = new_values.new_group

结果如您所料:

no_ group_  f0_ value   flag
1   a   2022-10-15  old y
3   b   2022-01-01  old n

相关问题