根据列条件跳过记录

时间:2015-08-17 05:14:36

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2 sql-server-2012

我在sql server中有一个问题

表名:Emp

Id  |Pid  |Firstname| LastName  | Level
1   |101  | Ram     |Kumar      | 3
1   |100  | Ravi    |Kumar      | 2
2   |101  | Jaid    |Balu       | 10
1   |100  | Hari    | Babu      | 5
1   |103  | nani    | Jai       |44
1   |103  | Nani    | Balu      |10
3   |103  |bani     |lalu       |20

这里需要根据id和Pid列检索唯一记录,并且需要跳过具有重复记录的记录。

最后我想要输出如下

Id  |Pid  |Firstname| LastName  | Level
1   |101  | Ram     |Kumar      | 3
2   |101  | Jaid    |Balu       | 10
3   |103  |bani     |lalu       |20

我根据以下查询找到了重复记录

select id,pid,count(*) from emp group by id,pid having count(*) >=2

此查询获取记录需要跳过以检索输出的重复记录

请告诉我如何编写查询以在sql server中实现此任务。

1 个答案:

答案 0 :(得分:2)

由于您的输出基于唯一的IDPID且没有任何重复值,因此您可以将COUNT与分区一起使用以获得所需的结果。

<强> SQL Fiddle

示例数据

CREATE TABLE Emp
    ([Id] int, [Pid] int, [Firstname] varchar(4), [LastName] varchar(5), [Level] int);

INSERT INTO Emp
    ([Id], [Pid], [Firstname], [LastName], [Level])
VALUES
    (1, 101, 'Ram', 'Kumar', 3),
    (1, 100, 'Ravi', 'Kumar', 2),
    (2, 101, 'Jaid', 'Balu', 10),
    (1, 100, 'Hari', 'Babu', 5),
    (1, 103, 'nani', 'Jai', 44),
    (1, 103, 'Nani', 'Balu', 10),
    (3, 103, 'bani', 'lalu', 20);

<强>查询

SELECT * 
FROM
(
SELECT *,rn = COUNT(*) OVER(PARTITION BY ID,PID)
FROM Emp
) Emp
WHERE rn = 1

<强>输出

| Id | Pid | Firstname | LastName | Level |
|----|-----|-----------|----------|-------|
|  1 | 101 |       Ram |    Kumar |     3 |
|  2 | 101 |      Jaid |     Balu |    10 |
|  3 | 103 |      bani |     lalu |    20 |