AutoNumber整数到带有最小ID的Varchar

时间:2015-02-25 15:51:24

标签: sql-server-2008 tsql

我的表格中包含FirstNameMiddle_InitialLast_NameDate_of_BirthMemberIDID列,可能有很多“口味” “ 至 目前该表有一个ID,它是一个自动编号,整数。

实施例:

 FIRST_NAME     MIDDLE_INITIAL     LAST_NAME      DOB          MEMBER_ID     ID
 John                              Doe            01/01/1984   AB123456      1
 John           J                  Doe            01/01/1984   AB123456      2
 John           James              Doe            01/01/1984   AB123456      3
 James                             Smith          12/01/1965   ZY987654      4
 James          K                  Smith          12/01/1965   ZY987654      5
 James                             Smith          08/20/1973   BB754321      6
  
  我期待/希望完成以下任务。

保留所有行;但要将ID更新为最小ID。

 FIRST_NAME     MIDDLE_INITIAL     LAST_NAME      DOB          MEMBER_ID     ID
 John                              Doe            01/01/1984   AB123456      1
 John           J                  Doe            01/01/1984   AB123456      1
 John           James              Doe            01/01/1984   AB123456      1
 James                             Smith          12/01/1965   ZY987654      4
 James          K                  Smith          12/01/1965   ZY987654      4
 James                             Smith          08/20/1973   BB754321      6
  
> 我的SQL技能下降,以找出如何做到这一点。

非常感谢任何帮助。

抱歉,不得不编辑/重新发帖。我们的想法是唯一性基于MEMBER_ID

3 个答案:

答案 0 :(得分:0)

UPDATE

;WITH cte AS(SELECT MEMBER_ID,
                    MIN(ID) AS ID,
             FROM TableName
             GROUP BY MEMBER_ID)
UPDATE  t SET ID = cte.ID
FROM TableName t
JOIN cte ON t.MEMBER_ID = cte.MEMBER_ID

SELECT

;WITH cte AS(SELECT MEMBER_ID,
                    MIN(ID) AS ID,
             FROM TableName
             GROUP BY MEMBER_ID)
SELECT t.FIRST_NAME,
       t.MIDDLE_INITIAL,
       t.LAST_NAME,
       t.DOB,
       t.MEMBER_ID,
       cte.ID
FROM TableName t
JOIN cte ON t.MEMBER_ID = cte.MEMBER_ID

答案 1 :(得分:0)

您是否只是使用DOB,LASTNAME和LASTNAME根据ID对这些用户进行分组?

如果是,那么你可以使用

SELECT * FROM (
SELECT *, ROW_NUMBER () OVER (PARTITION BY DOB,LASTNAME,FIRSTNAME ORDER BY DOBDESC) RN FROM YOURTABLE) A
WHERE A.RN = 1
ORDER BY MEMBNO

获取您需要的结果,然后使用DOB和LASTNAME为每个与行中结果匹配的条目分配新ID

答案 2 :(得分:0)

select table.*, getFirst.firstID
  from table  
  join (select memberID, min(ID) as firstID 
          from table 
         group by memberID ) as getFirst 
    on table.memberID = getFirst.memberID 

我认为这也会起作用

select table.*, MIN(ID) OVER(PARTITION BY memberID) AS "MinID"
  from table