如何按其顺序获取唯一记录

时间:2019-01-23 10:52:51

标签: sql sql-server

我有一个表,其中包含如下数据:

Name        Code    Sequence    AutoIncrementId
------------------------------------------------
Prashant    14323     1             11
Prashant    14323     1             12
Prashant    14323     1             13
Prashant    14323     1             14
Nishant     11323     2             11
Nishant     11323     2             12
Nishant     11323     2             13
Nishant     11323     2             14
Sushant     13223     3             11
Sushant     13223     3             12
Sushant     13223     3             13
Sushant     13223     3             14
Jishant     14223     4             11
Jishant     14223     4             12
Jishant     14223     4             13
Jishant     14223     4             14

预期输出为:

Name      Code      Sequence    AutoIncrementId
------------------------------------------------
Prashant  14323        1             11
Nishant   11323        2             12
Sushant   13223        3             13
Jishant   14223        4             14

示例查询以生成数据:

CREATE TABLE #temp
(
Name NVARCHAR(200),
Code NVARCHAR(200),
Sequence NVARCHAR(200),
AutoIncrementId NVARCHAR(200)
)

INSERT INTO #temp VALUES ('Prashant',14323,1,11)
INSERT INTO #temp VALUES ('Prashant',14323,1,12)
INSERT INTO #temp VALUES ('Prashant',14323,1,13)
INSERT INTO #temp VALUES ('Prashant',14323,1,14)

INSERT INTO #temp VALUES ('Nishant',11323,2,11)
INSERT INTO #temp VALUES ('Nishant',11323,2,12)
INSERT INTO #temp VALUES ('Nishant',11323,2,13)
INSERT INTO #temp VALUES ('Nishant',11323,2,14)

INSERT INTO #temp VALUES ('Sushant',13223,3,11)
INSERT INTO #temp VALUES ('Sushant',13223,3,12)
INSERT INTO #temp VALUES ('Sushant',13223,3,13)
INSERT INTO #temp VALUES ('Sushant',13223,3,14)

INSERT INTO #temp VALUES ('Jishant',14223,4,11)
INSERT INTO #temp VALUES ('Jishant',14223,4,12)
INSERT INTO #temp VALUES ('Jishant',14223,4,13)
INSERT INTO #temp VALUES ('Jishant',14223,4,14)

我尝试过的查询:

SELECT ROW_NUMBER() OVER(ORDER BY AutoIncrementId,Sequence) as RN,* 
FROM #temp ORDER BY RN

4 个答案:

答案 0 :(得分:3)

根据示例数据,您可以尝试使用distinct

SELECT distinct Namem,Code,Sequence,AutoIncrementId
FROM #temp 

答案 1 :(得分:2)

我不确定您想要的逻辑是什么。这是一种返回所需结果的方法:

select Name, Code, Sequence, 
       min(AutoIncrementId) + Sequence - 1 as AutoIncrementId
from #temp
group by Name, Code, Sequence;

上面的假设看起来像数字的值是数字。但是我看到您已经将它们存储为字符串,所以:

select Name, Code, Sequence, 
       convert(int, min(AutoIncrementId)) + convert(int, Sequence) - 1  as AutoIncrementId
from #temp
group by Name, Code, Sequence
order by sequence;

Here是db <>小提琴。

答案 2 :(得分:1)

您必须使用子查询并在此处使用一些技巧

   select Name,code,Sequence,AutoIncrementId from
   (
   SELECT *, dense_rank() OVER(partition by Name,code,Sequence ORDER BY  AutoIncrementId) as RN

    FROM #temp 
    ) t  where rn-Sequence=0
    order by Sequence

DEMO

    Name        code    Sequence    AutoIncrementId
   Prashant     14323   1           11
   Nishant      11323   2           12
   Sushant      13223   3           13
   Jishant      14223   4           14

答案 3 :(得分:1)

我不确定,但是在您的表中是否有任何标识列可用,那么您也可以使用以下查询获得所需的结果。

Select t.* from #temp t
inner join (
SELECT MIN(Id) as Id, Name, Code, Sequence
FROM   #temp
GROUP BY
       Name, Code, Sequence
)a on t.Id = a.Id

您可以找到实时演示here

或者您没有标识列,那么您可以应用诸如创建具有标识列的新临时表之类的逻辑。在新表中插入原始表的所有记录,并对具有标识列的新表进行上述查询。

您可以找到此逻辑here的实时内容。