【问题标题】:MODE in Teradata SQL - excluding a value from the range, and using multiple tablesTeradata SQL 中的 MODE - 从范围中排除一个值,并使用多个表
【发布时间】:2016-10-22 18:22:09
【问题描述】:

我正在比较 3 个数据表来满足相同的需求,并希望创建一个表来显示其中两个表的 MODE(以便提出正确值的建议)。我可能需要连接,因为我正在寻找具有相同 ID 和名称的所有行的模式。

表 1:

+----------+----------+------+ |需求编号 |姓名 |尺寸 | +----------+----------+------+ | 1 |理查德 | 42 | | 2 |理查德 | 42 | | 3 |理查德 | 42 | | 4 |理查德 | 36 | | 5 |理查德 | 36 | | 6 |理查德 | 36 | | 7 |理查德 | 36 | | 8 |卢克 | 14 | | 9 |卢克 | 14 | | 10 |卢克 | 14 | | 11 |卢克 | 14 | | 12 |卢克 | 14 | | 13 |卢克 | 25 | | 14 |卢克 | 25 | | 15 |卢克 | 25 | +----------+----------+------+

表 2:

+----------------+-----------------+ | List1_DemandNo | List1_PenColor | +----------------+-----------------+ | 1 |白色 | | 2 |黑色 | | 3 |黑色 | | 4 |红色 | | 5 | ? | | 6 |红色 | | 7 |红色 | | 8 |黄色 | | 9 |黄色 | | 10 |黄色 | | 11 |绿色 | | 12 |黄色 | | 13 |绿色 | | 14 | ? | | 15 | ? | +----------------+-----------------+

表 3:

+----------------+-----------------+ | List2_DemandNo | List2_PenColor | +----------------+-----------------+ | 1 |白色 | | 2 |绿色 | | 3 |绿色 | | 4 |红色 | | 5 | ? | | 6 |红色 | | 7 |红色 | | 8 |粉色 | | 9 |粉色 | | 10 |黄色 | | 11 |绿色 | | 12 |粉色 | | 13 |橙色 | | 14 |橙色 | | 15 |橙色 | +----------------+-----------------+

所以我需要为每个具有相同姓名和体型的人生成推荐。建议应该是 table1 中所有行的 MODE,其中人的名字和大小相同(我需要连接名字和大小吗?)

另一个要求是所有问号“?”应该从模式/建议中排除。

所以我的结果表应该是这样的:

+------------+----------+------+------------+-------- ----+ |需求编号 |姓名 |尺寸 | List1_MODE | List2_MODE | +------------+----------+------+------------+-------- ----+ | 1 |理查德 | 42 |黑色 |绿色 | | 2 |理查德 | 42 |黑色 |绿色 | | 3 |理查德 | 42 |黑色 |绿色 | | 4 |理查德 | 36 |红色 |红色 | | 5 |理查德 | 36 |红色 |红色 | | 6 |理查德 | 36 |红色 |红色 | | 7 |理查德 | 36 |红色 |红色 | | 8 |卢克 | 14 |黄色 |粉色 | | 9 |卢克 | 14 |黄色 |粉色 | | 10 |卢克 | 14 |黄色 |粉色 | | 11 |卢克 | 14 |黄色 |粉色 | | 12 |卢克 | 14 |黄色 |粉色 | | 13 |卢克 | 25 |绿色 |橙色 | | 14 |卢克 | 25 |绿色 |橙色 | | 15 |卢克 | 25 |绿色 |橙色 | +------------+----------+------+------------+-------- ----+

我了解 MODE 函数在 Teradata 中不起作用,我需要执行计数,但是使用 3 个表计算模式并排除 ?可悲的是超出了我的 SQL 技能 - 任何帮助将不胜感激!

非常感谢 理查德

【问题讨论】:

    标签: sql join teradata mode


    【解决方案1】:

    您需要为每种模式编写一个单独的选择并加入它:

    select t1.*, List1_PenColour, List2_PenColour 
    from table1 as t1
    left join 
      (
        select Forename, Size, List1_PenColour
        from table1 as t1
        join table2 as t2
        on t1.DemandNo = t2.List1_DemandNo
        and List1_PenColour <> '?'
        group by Forename, Size, List1_PenColour
        -- return only the row with the highest count
        -- random row if multiple rows with the same count exist
        qualify row_number()
                over (partiton by Forename, Size, List1_PenColour 
                      order by count(*) desc) = 1 
      ) as list1
    on t1.Forename = list1.Forename
    and t1.Size = list1.Size
    left join 
      (
        select Forename, Size, List2_PenColour
        from table1 as t1
        join table3 as t3
        on t1.DemandNo = t3.List2_DemandNo
        and List2_PenColour <> '?'
        group by Forename, Size, List2_PenColour
        qualify row_number() 
                over (partiton by Forename, Size, List2_PenColour 
                      order by count(*) desc) = 1 
      ) as list2
    on t1.Forename = list2.Forename
    and t1.Size = list2.Size
    

    【讨论】:

    • 非常感谢(再次!)您的帮助....您通常为此收费吗?我觉得我欠你一些钱!我还没有完全检查上述代码的输出,但它似乎可以工作,谢谢! (我只是在底部将 List1_Pencolour 更改为 List2_PenColour (我认为它与剪切和粘贴的顶部相同?)
    • 不幸的是,代码似乎没有给我我需要的东西 - 它为一些共享共同名字和大小的行返回了一些不同的结果 - 我本来希望所有东西都具有相同的名字和 Size 以使 PenColour 具有相同的 MODE 值。这可能是由于当有多个具有相同计数的 PenColour 时随机选择...但这似乎发生在许多行上,这几乎就像它在计算重复项但给它们一个不同的 PenColour,然后给两者输入一个随机值
    • @Surfing:除非有另一个错字,否则每个名字/大小组合应该返回相同的颜色(至少派生表会这样做)
    • 好的,谢谢。在编辑代码以适合我的真实数据时,我可能犯了一个错误。非常感谢您的帮助,干杯。
    • 是否可以进行简单的编辑以包含 List1_PenColour 和 List2_PenColour 的列(以在模式旁边显示原始值)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2021-02-24
    • 2020-05-22
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多