我正在尝试使用递归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中。因此,我想要的输出是将它们全部映射到一组,而我使用的代码似乎没有。
在此方面的任何帮助将不胜感激:)谢谢!
答案 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