2015-05-07 42 views
2

我有一个有趣的问题,我想为一个表格生成一个8位唯一ID。我有一列中的前四位数字,任务是将另外四位数字附加到现有的四位数字上。以下是条件和样本数据。根据三列引入4位数字

前4位被在此列 “AFFECTSID_NEW” 从波纹管的样本数据

发现

示例数据:

AFFECTSID_NEW | activityname​    | actionname 
--------------------------------------------------------------- 
2301   | Default Proposed Activity | sample 2 
2301   | Communicating welcome pack | sample 1 
1206   | Execute events (7 Events) | International Trade Seminar 
1206   | Execute events (8 Events) | Workshop with one law firm 
1206   | Execute events (8 Events) | Workshop with International Speaker 
1206   | Execute events (8 Events) | Seminar with Government agency 
1206   | Execute events (8 Events) | Execute events (8 Events) 
1205   | Resolve commercial disputes | Resolve commercial disputes 

例:

为了产生第5位和第6位

  1. 为相同的 “Affectsid_new” 和独特的 “activityname” 它应该是01,02,03 ...
  2. 非独特的 “activityname” 和“活动名称=动作名称“它应该是上述点的延续数字1如果”Affectsid_new“也是非唯一的或i T应当是“”如果“Affectsid_new”是唯一

一旦第5和第6位数字生成这些是产生的第7和第8位的条件

  1. 对于相同的“Affectsid_new”和唯一的“活动名称”它应该是 是“ “
  2. 非独特的” activityname “和” activityname=actionname “应该是” “
  3. 非独特的” activityname “和” activitynameactionname“(不等于)它应该是从上述点2(02,03,04 ..)的连续数字。)如果 “Affectsid_new” 也非唯一的或者它应该是 “” 如果 “Affectsid_new” 是独特

预期的结果是如下

AFFECTSID_NEW | activityname​     | actionname       | Expected 
--------------------------------------------------------------------------------------------------- 
2301   | Default Proposed Activity  | sample 2        | 23010101 
2301   | Communicating welcome pack  | sample 1        | ​23010201 
1206   | Execute events (7 Events)  | International Trade Seminar   | 12060101 
1206   | Execute events (8 Events)  | Workshop with one law firm   | ​12060202 
1206   | Execute events (8 Events)  | Workshop with International Speaker | ​12060203 
1206   | Execute events (8 Events)  | Seminar with Government agency  | ​12060204 
1206   | Execute events (8 Events)  | Execute events (8 Events)   | ​12060201 
1205   | Resolve commercial disputes | Resolve commercial disputes   | ​12050101 
+1

所以,这RDBMS? – Strawberry

+0

它是mysql或sql server吗? – Deepshikha

+0

那么,哪个RDBMS?它的MySQL或SQL服务器? –

回答

2
SELECT 
    * 
,AFFECTSID_NEW 
    + REPLACE(STR(DENSE_RANK() OVER(PARTITION BY AFFECTSID_NEW ORDER BY activityname​),2),' ','0') 
    + REPLACE(STR(ROW_NUMBER() OVER(PARTITION BY AFFECTSID_NEW,activityname ORDER BY actionname​),2),' ','0') 
FROM MyTable 
+0

尽管这段代码可能会回答这个问题,但几句解释将有助于当前和未来的读者更好地理解这个答案。 – Thom

+0

@Anon精彩!谢谢:) –

+0

什么地狱。你声明它的mysql,你从标签列表中删除sql-server,然后接受一个sql-server的答案? –

0

请尝试以下未注释的查询。我试图实现你所需要的,但结果与你在这里给出的例子不完全一样。结果取决于您选择订购的列:

SELECT *, 
(AFFECTSID_NEW + 
RIGHT('00' + CONVERT(NVARCHAR, RANK() OVER (PARTITION BY AFFECTSID_NEW ORDER BY activityname)), 2) + 
RIGHT('00' + CONVERT(NVARCHAR, RANK() OVER (PARTITION BY activityname ORDER BY actionname)), 2)) AS Expected 
FROM #TempTable 

以下是表创建脚本(以防万一)。

--CREATE TABLE #TempTable (AFFECTSID_NEW NVARCHAR(8), activityname NVARCHAR(256), actionname NVARCHAR(256)) 

--INSERT INTO #TempTable 
--VALUES 
--('2301', 'Default Proposed Activity', 'sample 2'), 
--('2301', 'Communicating welcome pack', 'sample 1'), 
--('1206', 'Execute events (7 Events)', 'International Trade Seminar'), 
--('1206', 'Execute events (8 Events)', 'Workshop with one law firm'), 
--('1206', 'Execute events (8 Events)', 'Workshop with International Speaker'), 
--('1206', 'Execute events (8 Events)', 'Seminar with Government agency'), 
--('1206', 'Execute events (8 Events)', 'Execute events (8 Events)'), 
--('1205', 'Resolve commercial disputes', 'Resolve commercial disputes') 

希望这有助于...