【问题标题】:FInd the match data in SQL在 SQL 中查找匹配数据
【发布时间】:2022-01-24 07:16:12
【问题描述】:

我有一个名为 Product 的表。它有称为颜色的列。它包含如下数据:

颜色的数据类型是varchar。该数据库包含大量产品值(近 200 种),颜色也是如此。现在我需要编写一个 sql 查询脚本来查找颜色变化最大的前 2 个产品。

【问题讨论】:

  • 请以文本形式发布您的数据。您的 SQL Server 版本是多少?
  • 请不要标记垃圾邮件,SQLLite MySql SQLServer,为您的特定RDBMS添加标记
  • 为什么不修复您的设计并对其进行规范化?

标签: sql database


【解决方案1】:

您需要对每个产品(品牌)的颜色进行拆分和计数:

SELECT products, colors
FROM (
   SELECT 
      *,
      DENSE_RANK() OVER (ORDER BY (
         SELECT COUNT(DISTINCT LTRIM(RTRIM([value]))) 
         FROM STRING_SPLIT(SUBSTRING(colors, 2, LEN(colors) - 2), ',')
         ) DESC
      ) AS rank
   -- FROM YourTable
   FROM (VALUES
      ('adidas', '{red, blue, black}'),
      ('puma', '{red, green, blue, orange}'),
      ('nike', '{red, green}')
   ) product (products, colors)
) t
WHERE rank <= 2

结果:

products colors 
----------------------------------
puma     {red, green, blue, orange}
adidas   {red, blue, black}

如果您需要计算颜色,只需添加一列:

SELECT products, colors
FROM (
   SELECT 
      *,
      (
         SELECT COUNT(DISTINCT LTRIM(RTRIM([value]))) 
         FROM STRING_SPLIT(SUBSTRING(colors, 2, LEN(colors) - 2), ',')
      ) AS [count]
   FROM (VALUES
      ('adidas', '{red, blue, black, blue, red}'),
      ('puma', '{red, green, blue}'),
      ('nike', '{red, green}')
   ) product (products, colors)
) t
WHERE [count] > 2

【讨论】:

  • 数据库很大,包含很大的产品价值(近 200 个),颜色也是如此。我们如何优化 FROM (VALUES ('')) 部分,因为我无法手动做到这一点。
  • @manojadhikari 这是您提供给我们的示例数据,您显然不会使用 VALUES 表结构,而您会使用 your table
  • @Larnu 谢谢!! ,因为我是新来的,学习可以使用表名重构。
  • 我不适合回答某人的问题,@manojadhikari,但它只是FROM dbo.YourTable
  • 这是一个不同的问题,@manojadhikari,不过,我建议您以 Turning a Comma Separated string into individual rows 为起点。
【解决方案2】:
WITH CTE(PRODUCT,COLOR) AS
(
  SELECT 'ADIDAS','{RED,BLUE}' UNION ALL
  SELECT 'REEBOK','{PURPLE,GRAY,BLACK,ORANGE}' UNION ALL
  SELECT 'NIKE','{}'UNION ALL
  SELECT 'PUMA','{RED,BLACK,ORANGE}'
)
SELECT TOP 2 C.PRODUCT,C.COLOR,LEN(C.COLOR)XX
FROM CTE AS C
ORDER BY XX DESC

如果以上适合你,请你试试

【讨论】:

  • 我认为这不适用于颜色和产品值以千为单位的大型数据库。
  • 不,“最佳”解决方案是修复和规范您的设计,以获得最高性能的解决方案,@manojadhikari。
  • 不确定这是否可靠,例如 {mustard yellow, chartreuse}, {red,blue,pink}
猜你喜欢
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
相关资源
最近更新 更多