使用MySQL隐藏50%的低值行

使用MySQL隐藏50%的低值行,mysql,select,random,Mysql,Select,Random,我有一个有三列的表: 说明(字符串) 值(1-3之间的整数) 日期 我想构建一个select,它返回: 值为3的行的100% 值为2的行的50% 值为1的行的25% 按日期订购“隐藏”值为1或2的行可以是随机的,但不一定是随机的(例如,每隔一行“隐藏”值为2) 如果只使用一个查询而不使用其他PHP脚本,这是可能的吗?一个选项是使用具有随机顺序的分析函数来识别每个值类型的前N% WITH cte AS ( SELECT *, SUM(Value = 2) OVER

我有一个有三列的表:

  • 说明(字符串)
  • 值(1-3之间的整数)
  • 日期
我想构建一个select,它返回:

  • 值为3的行的100%
  • 值为2的行的50%
  • 值为1的行的25%
按日期订购“隐藏”值为1或2的行可以是随机的,但不一定是随机的(例如,每隔一行“隐藏”值为2)


如果只使用一个查询而不使用其他PHP脚本,这是可能的吗?

一个选项是使用具有随机顺序的分析函数来识别每个值类型的前N%

WITH cte AS (
    SELECT *,
        SUM(Value = 2) OVER (ORDER BY RAND()) / SUM(Value = 2) OVER () pct_2,
        SUM(Value = 1) OVER (ORDER BY RAND()) / SUM(Value = 1) OVER () pct_1
    FROM yourTable
)

SELECT *
FROM cte
WHERE Value = 1 AND pct_1 > 0.25 OR Value = 2 AND pct_2 > 0.5 OR Value = 3;

一种选择是使用随机排序的分析函数来识别每种值类型的前N%

WITH cte AS (
    SELECT *,
        SUM(Value = 2) OVER (ORDER BY RAND()) / SUM(Value = 2) OVER () pct_2,
        SUM(Value = 1) OVER (ORDER BY RAND()) / SUM(Value = 1) OVER () pct_1
    FROM yourTable
)

SELECT *
FROM cte
WHERE Value = 1 AND pct_1 > 0.25 OR Value = 2 AND pct_2 > 0.5 OR Value = 3;