【问题标题】:max frequency in sqlsql中的最大频率
【发布时间】:2022-01-21 11:51:18
【问题描述】:

我有 2 个表(mysql)

  1. tbl_products
  2. tbl_counting

我在 tbl_counting 表中收集了 3 个用户的“机架”和“库存”信息。 我想用 tbl_counting 数据更新“tbl_products.rack”和“tbl_products.stock” 在这种情况下(如结果):

  • 每个“机架”和“库存”信息必须由至少 3 个用户收集
  • tbl_products.rack”和“tbl_products.stock”必须以“Rack”或“Stock”信息的最高频率(至少 2 次)更新
  • 如果“Rack”或“Stock”信息重复少于 2 次,请使用“Unknow”指定字段。 (类似结果)

谢谢

1. tbl_products(更新前)

id product_name rack stock
1 apple
2 orange
3 strawberry



2。 tbl_counting

product_id user_id rack stock
1 1 A-1-1 20
1 2 A-1-1 10
1 3 B-1-1 20
2 1 C-1-1 10
2 2 D-2-1 30
2 3 A-3-1 30
3 1 X-3-1 25
3 2 X-1-1 10
3 3 X-3-1 25

结果:tbl_products(更新后)

id product_name rack stock
1 apple A-1-1 20
2 orange Unknown 30
3 strawberry X-3-1 25
select 
tbl_counting.product_id,
tbl_counting.rack,
MAX(tbl_counting.stock),
count(*) as freq
from tbl_counting 

group by tbl_counting.product_id
having count(*) =(select max(freq) 
from (select product_id,count(*) as freq 
from tbl_counting group by product_id) tbl_counting)

【问题讨论】:

  • 你是怎么解决这个问题的?它停在哪里?为什么停在那里?什么(确切地)出了问题?为什么别人需要解决你的(家庭)工作?
  • 为什么apple 的库存是 20 而不是 10?两行都有A-1-1 作为rack
  • 我们在哪里可以找到机架Unknown

标签: mysql sql


【解决方案1】:

这是一种可能的解决方案。前两个 cte 按产品为您提供用户数和不同机架,在下一个 cte 中用于过滤符合给定条件的记录。

UPDATE tbl_products P
JOIN (
    WITH uses_count AS
    (
        SELECT product_id,              
               COUNT(DISTINCT user_id) AS num_users         
        FROM tbl_counting 
        GROUP BY product_id
    )
    , rack_count AS
    (
        SELECT product_id,   
               rack,
               COUNT(*) AS freq         
        FROM tbl_counting 
        GROUP BY product_id, rack
    )
    ,rank_result AS 
    (
      SELECT T.product_id,
             T.rack,
             T.stock,
             R.freq,
             U.num_users,                 
             ROW_NUMBER() OVER(PARTITION BY T.product_id ORDER BY R.freq DESC, T.stock DESC) AS RN
      FROM tbl_counting T
      LEFT JOIN uses_count U
        ON T.product_id = U.product_id
           AND CASE WHEN U.num_users >= 3 THEN TRUE ELSE FALSE END
      LEFT JOIN rack_count R
        ON T.product_id = R.product_id
           AND CASE WHEN R.freq >= 2 THEN TRUE ELSE FALSE END  
    )
    SELECT product_id, 
           stock,               
           CASE WHEN freq IS NULL THEN 'Unknown' ELSE rack END AS rack
    FROM  rank_result
    WHERE RN = 1) R
  ON P.Id = R.product_id
SET P.stock = R.stock,
    P.rack = R.rack
    

【讨论】:

  • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 34 行的“UPDATE tbl_products P JOIN rank_result R ON P.Id = R.product_id AN...”附近使用正确的语法
  • 尝试更新的查询是否有效。
  • “字段列表”中的未知列“R.freq”
  • 立即尝试。它在其中一个 ctes 中丢失。
  • “字段列表”中的未知列“R.c”
【解决方案2】:

你可以检查一下

SELECT
    product_id p,
    shelf,
    floor,
    line,
    stock 
FROM
    user_product 
GROUP BY
    product_id,
    stock,
    floor,
    line,
    shelf
HAVING
    stock = ( SELECT stock FROM user_product WHERE product_id = p GROUP BY stock ORDER BY count(*) DESC LIMIT 1 ) AND
    floor = ( SELECT floor FROM user_product WHERE product_id = p GROUP BY floor ORDER BY count(*) DESC LIMIT 1 ) AND
    line = ( SELECT line FROM user_product WHERE product_id = p GROUP BY line ORDER BY count(*) DESC LIMIT 1 ) AND
    shelf = ( SELECT shelf FROM user_product WHERE product_id = p GROUP BY shelf ORDER BY count(*) DESC LIMIT 1 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2012-04-04
    • 2021-01-30
    • 2020-01-25
    • 2020-07-06
    相关资源
    最近更新 更多