【问题标题】:SQL: identify if there are multiples (not duplicates) in a columnSQL:识别列中是否有多个(不重复)
【发布时间】:2021-02-24 13:08:11
【问题描述】:

我目前正在努力寻找使用 SSMS 识别数据中某些模式的可能性。 我希望识别在同一列中包含多个条目(x2、x3 或 x*4)的行。

我现在真的不知道如何开始我的“where”语句。

SELECT  [numbers], [product_ID]
FROM [db].[dbo].[tablename]
WHERE [numbers] = numbers*2   

我的问题是,上面的代码显然只能识别零。

Google 仅帮助我查找重复项,但我无法找到识别多个值的方法...

我想要的结果将是一个只包含彼此倍数的数字(链接到 product_ID)的表格

有人可以帮我吗?

【问题讨论】:

  • 样本数据和预期结果将帮助我们帮助您。 [numbers] = numbers*2 永远不会为真,除非 numbers 具有值 0(如 0*2 = 0)。

标签: sql sql-server duplicates


【解决方案1】:

如果一列包含倍数,则所有都是最小非零值的倍数。为此,我假设这些值是正数或零。

因此,您可以使用窗口函数和模运算来确定是否是这种情况:

select t.*
from (select t.*,
             min(case when number > 0 then number end) over () as min_number
      from t
     ) t
where number % min_number = 0 or min_number = 1;

如果您想知道所有个数字是否符合此条件,请使用聚合:

select (case when min(number % min_number) = 0 then 'all multiples' else 'oops' end)
from (select t.*,
             min(case when number > 0 then number end) over () as min_number
      from t
     ) t

【讨论】:

    【解决方案2】:

    我想要的结果将是一个只包含彼此倍数的数字(链接到 product_ID)的表格

    您需要测试所有行对,这意味着一个 CROSS JOIN。

    类似这样的:

    with q as
    (
    SELECT  [numbers], 
            [product_ID], 
            cast(a.numbers as float) / coalesce(b.numbers, null) ratio
    FROM [tablename] a
    CROSS JOIN [tablename] b
    )
    select *
    from q
    where ratio = cast(ratio as bigint)
    and ratio > 1
    

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2021-01-03
      • 2011-02-21
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多