需要SQL Server中的查询逻辑

需要SQL Server中的查询逻辑,sql,sql-server,Sql,Sql Server,我有一个名为product的表,如下所示: source_item_id source_rev_id ---------------------------- 111 a_01_tz 111 b_01_tz 111 c_01_tz 222 e_02_tz 222 f_02_tz 222 g_01_tz 333 h

我有一个名为
product
的表,如下所示:

source_item_id source_rev_id  
----------------------------
111              a_01_tz
111              b_01_tz
111              c_01_tz
222              e_02_tz
222              f_02_tz
222              g_01_tz
333              h_03_tz
444              g_04_tz
现在我希望以这种格式输出:

source_item_id source_rev_id  target_rev_id
--------------------------------------------
111              a_01_tz       AAA
111              b_01_tz       AAB
111              c_01_tz       AAC
222              e_02_tz       AAA
222              f_02_tz       AAB
222              g_01_tz       AAC
333              h_03_tz       AAA
444              g_04_tz       AAA
444              l_04_tz       AAB
对于一个
source\u item\u id
,可以有多个
source\u rev\u id


请帮忙写查询。谢谢。

使用SQL很难做到,但是在cpp中使用了一个next_排列函数来获取字符串的下一个排列,例如,因此,它类似于AAA的下一个排列是AAAB,每次您找到相同的项目id时都应用它。

一种方法是创建一个包含所有目标版本id的永久查找表,其中包含一个id列,如

1   AAA
2   AAB
3   AAC
4   AAD
5   AAE
等等


然后,您可以使用ROW_NUMBER函数连接到该表。

组合子查询以创建项目计数器和表达式以从计数器创建
AAA
ZZZ

SELECT    
 source_item_id, source_rev_id ,
   CHAR( (target_rev_num)/676 % 26 + 65)
 + CHAR( (target_rev_num)/26  % 26 + 65)
 + CHAR(  target_rev_num      % 26 + 65)
 AS target_rev_id
FROM (    
  SELECT source_item_id, source_rev_id ,
         ROW_NUMBER() OVER ( PARTITION BY source_item_id 
                             ORDER BY source_rev_id ) -1
         AS target_rev_num
  FROM product
) P

对于source_item_id 222,您的值错误,或者我不理解逻辑。我看到AAA twiceyou示例对我来说似乎没有逻辑。那么您想在一个包含三个字符的字段上加上一个字符?请描述应该发生什么。所以。。。这些目标版本ID来自哪里?我可以对逻辑进行逆向工程,但是
222
没有任何意义。你在示例中指出了吗?如果这是一种模式,那么一些有趣的东西,比如
CHAR(ROW\u NUMBER()OVER(按源划分\u项\u id顺序按源划分\u修订\u id)+64)
,然后点击到下一个位置。也许有点疯狂。这很好。回答得很好,但为了避免将来的读者感到困惑,你实际上并没有使用CTE。您使用了一个派生表。顺便说一下,您需要使用别名。