SQL奇怪分组-匹配共享两列中任一列的公共值的行吗?

时间:2019-01-07 20:56:54

标签: sql sql-server recursion mapping common-table-expression

我正在尝试使用递归CTE将“组ID”列添加到我的数据中以进行映射。我在这里使用代码(SQL Server Weird Grouping Scenario by multiple columns and OR),但是此代码的输出无法正常工作。

我有一个SQL Server表#cache_resale_tbl,我想添加一个“组ID”列,该行将行存储在组中。

表名称:#cache_resale_tbl

列:密钥ID,采购订单号(“ col1”),票证编号(“ col2”)

我想添加一个具有组ID的列,并且具有相同PO号或故障单号的所有行都具有相同的组ID。

这是我正在使用的代码:

with g (rootid, previd, level, KeyID, col1, col2) as 
(
    select 
        KeyID, 0, 1, KeyID, col1, col2 
    from 
        #cache_resale_tbl

    union all

    select 
        g.rootid, g.KeyID, g.level + 1, v.KeyID, v.col1, v.col2
    from 
        g
    join 
        #cache_resale_tbl v on v.col1 = g.col1 or v.col2 = g.col2
    where 
        v.KeyID > g.KeyID
),
m (KeyID, rootid) as 
(
    select 
        KeyID, min(rootid) 
    from 
        g 
    group by 
        KeyID
)
select 
    v.KeyID, v.col1, v.col2,
    cast(min(rootid) as varchar(50)) as 'Group ID' 
from 
    m
inner join 
    #cache_resale_tbl v on v.KeyID = m.KeyID
group by 
    v.KeyID, v.col1, v.col2;

#cache_resale_tbl的示例输入:

KeyID   col1   col2
-----------------------
1   PO25303309  255207
2   PO25303304  257459
3   PO25303305  257459
4   PO25303306  257459
5   PO25303307  257459
6   PO25303309  257459

代码输出:

KeyID   col1   col2    Group ID
----------------------------
1   PO25303309  255207  1
2   PO25303304  257459  2
3   PO25303305  257459  2
4   PO25303306  257459  2
5   PO25303307  257459  2
6   PO25303309  257459  1

所需的输出:

KeyID   col1   col2    Group ID
----------------------------
1   PO25303309  255207  1
2   PO25303304  257459  1
3   PO25303305  257459  1
4   PO25303306  257459  1
5   PO25303307  257459  1
6   PO25303309  257459  1

我的预期输出是“组ID”列为这些行返回所有相同的数字。最后5行应具有相同的组ID,因为它们具有相同的col2值。并且第一张票证也属于该组,因为行1和6具有相同的col1值。具有相同col1或col2值的任何行应在相同的组ID中。因此,我想要的输出是将它们全部映射到一组,而我使用的代码似乎没有。

在此方面的任何帮助将不胜感激:)谢谢!

1 个答案:

答案 0 :(得分:0)

我相信这可以解决问题中最初提出的问题。 col1或col2中未重复的订单被分组在一起(例如,CTE中的注释行CustomToolbarWrapper)。

using System;
class Start
{

static void Main()
{
    Console.WriteLine(FindPalindroms());
    Console.ReadKey();
}

static bool IsPalindrom(int numb)
{
    string sub1 = "";
    string sub2 = "";
    string productString = "";

    productString = Convert.ToString(numb);
    sub1 = productString.Substring(0, productString.Length / 2);
    sub2 = productString.Substring(productString.Length / 2, productString.Length / 2);
    sub2 = Reverse(sub2);

    if (sub1.Equals(sub2))
    {
        return true;
    }
    return false;
}
static bool FindPalindroms()
{
    int product = 0;
    for (int i = 100; i < 999; i++)
    {
        for (int j = 100; j < 999; j++)
        {
            product = i * j;

            if (IsPalindrom(product))
            {
                Console.WriteLine("Palindrom found: " + product);
                return true;
            }
        }
    }
    return false;
}
public static string Reverse(string s)
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}
}

这里是db<>fiddle