2014-11-06 67 views
1

我有一个子查询该表中选择:SQL查询添加自定义值选择基于对不同的列值

Name ResultType TestID 
Guy1 Result A  1 
Guy1 Result B  1 
Guy1 Result C  1 
Guy1 Result A  2 
Guy1 Result C  2 
Guy1 Result B  3 
Guy2 Result A  4 
Guy2 Result C  4 
Guy3 Result D  5 
Guy3 Result A  6 
--ETC 

testIDs的名单,结果他们得到了与用户的名称。 我希望能够得到这个SELECT语句:SELECT语句中

Name ResultType TestID WhichTestNumberWasIt 
Guy1 Result A  1   1 
Guy1 Result B  1   1 
Guy1 Result C  1   1 --The first distinct TestID for this user 
Guy1 Result A  2   2 
Guy1 Result C  2   2 --The second 
Guy1 Result B  3   3 --And third 
Guy2 Result A  4   1 --This is the first distinct TestID for this user 
Guy2 Result C  4   1 
Guy3 Result D  5   1 --Again, same distinct TestID for another user 
Guy3 Result A  6   2 
--ETC 

最好,因为这是一个子查询从JOIN这是一个()内,这是相当可观的已经(我省略了一堆列这里)。

有没有办法做到这一点?

+0

计算独特testid的逻辑是什么? – 2014-11-06 14:06:51

+0

@SanjayGoswami这是'PIVOT'查询的一部分,我需要将不同值的'TestID'分组,因此无论用户如何,我都可以对它们进行转换(因为'TestID'值是自动递增的) – Danicco 2014-11-06 14:09:02

回答

3
CREATE TABLE #tmp 
(
    NAME VARCHAR(100), 
    RT VARCHAR(50), 
    testid INT 
) 

Insert into #tmp values('Guy1','Result A',1) 
Insert into #tmp values('Guy1','Result B',1) 
Insert into #tmp values('Guy1','Result C',1) 
Insert into #tmp values('Guy1','Result A',2) 
Insert into #tmp values('Guy1','Result C',2) 
Insert into #tmp values('Guy1','Result B',3) 
Insert into #tmp values('Guy2','Result A',4) 
Insert into #tmp values('Guy2','Result C',4) 
Insert into #tmp values('Guy3','Result D',5) 
Insert into #tmp values('Guy3','Result A',6) 


SELECT *,DENSE_RANK() Over(PARTITION BY NAME ORDER BY TestID ASC) as Rank FROM #tmp 
+0

非常感谢! – Danicco 2014-11-06 14:23:58

2

您可以使用DENSE_RANK得到这个:

SELECT Name, 
     ResultType, 
     TestID, 
     TestNumber = DENSE_RANK() OVER(PARTITION BY Name ORDER BY TestID) 
FROM <Subquery>; 

例如在SQL小提琴

完整的例子

IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL DROP TABLE #T; 

CREATE TABLE #T ([Name] VARCHAR(4), [ResultType] VARCHAR(8), [TestID] INT) 
INSERT INTO #T ([Name], [ResultType], [TestID]) 
VALUES 
    ('Guy1', 'Result A', 1), 
    ('Guy1', 'Result B', 1), 
    ('Guy1', 'Result C', 1), 
    ('Guy1', 'Result A', 2), 
    ('Guy1', 'Result C', 2), 
    ('Guy1', 'Result B', 3), 
    ('Guy2', 'Result A', 4), 
    ('Guy2', 'Result C', 4), 
    ('Guy3', 'Result D', 5), 
    ('Guy3', 'Result A', 6); 

SELECT Name, 
     ResultType, 
     TestID, 
     TestNumber = DENSE_RANK() OVER(PARTITION BY Name ORDER BY TestID) 
FROM #T 
ORDER BY Name, TestID; 
+0

嘿,我很慢,我做了一些工作,所以贴在它上面...我没有复制 – 2014-11-06 14:19:45

+0

也谢谢!虽然你迟了3分钟呵呵 – Danicco 2014-11-06 14:24:13