【问题标题】:SQL Query about percentage selection关于百分比选择的 SQL 查询
【发布时间】:2022-01-17 15:31:51
【问题描述】:

我正在尝试编写一个条件查询: 如果最近前 5 行(按日期列)的 >=80%(4 行或更多行为 4/5*100=80%),对于 KEY 的值 =A 或 =B,则将标志从失败更改为通过整个 KEY。 下面是输入输出示例:

我在示例中用绿色突出显示了最近的行。 有人可以帮我吗?

我尝试通过以下代码找到最近的前 5 行:

select * from(
select *, row_number() over (partition by "KEY") as 'RN' FROM (
select * from tb1
order by date desc))
where "RN"<=5

不知道接下来该做什么

【问题讨论】:

  • 按 KEY、DATE 分组并使用基于 COUNT(*)>4 的 CASE 表示通过/失败和值
  • 向我们展示你迄今为止的尝试!?
  • 为了获得更好的帮助,请避免发布images 的数据,我们无法从图像中剪切和粘贴,示例数据应该是您的问题中的consumable text ,理想情况下是 createinsert 语句,或者 DB<>Fiddle
  • 如果 >=80% .. 对于一个 KEY 的值 =A 或 =B,则更改标志 所有值都必须相同吗?还是 2*A+2*B+С 也匹配?
  • @Akina 它应该只有 A 或 B。

标签: mysql sql


【解决方案1】:

测试一下:

WITH 

-- enumerate rows per key group 
cte1 AS ( SELECT *, 
                 ROW_NUMBER() OVER (PARTITION BY `key` ORDER BY `date` DESC) rn
          FROM sourcetable ),

-- take 5 recent rows only, check there are at least 4 rows with A/B 
cte2 AS ( SELECT `key`
          FROM cte1
          WHERE rn <= 5
          GROUP BY `key`
          HAVING (    SUM(`value` = 'A') >= 4 
                   OR SUM(`value` = 'B') >= 4 )
          -- AND SUM(rn = 5) )

-- update rows with found key values
UPDATE sourcetable
  JOIN cte2 USING (`key`)
SET flag = 'PASS';

5.7 版本 – Ayn76

将 CTE 转换为子查询。使用用户定义的变量模拟 ROW_NUMBER()。

【讨论】:

  • @MatBailie OP 明确告知:“.. 4 行或更多行..”。
  • @MatBailie 另外'A3''A4' 在显示的示例数据中与描述的情况相匹配,并且它们没有更新。
  • @MatBailie 我的解决方案有落后的问题 - 如果只有 4 行,并且它们都是 A(或 B),它们将被更新,这可能是错误的。让我们等待 OP...
  • 其 80% 或更多,这意味着在 5 场比赛中,4 场或更多场为 4/5*100 = 80%。 A3 AND A4 不符合 5 次匹配的条件,因为每个 KEY 只有一条记录。
  • @Ayn76 这是否意味着当某些key 的总行数为4 时,无论如何都不能更新这些行?即使所有 4 行都是 value='A'?
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 2012-06-30
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多