2012-07-04 125 views
1

我在SQLServer中有一個數據庫,其中有一個名爲emp_details的數據庫有多行。該表包含幾個字段,其中一個是薪水。薪水對於員工來說並不是唯一的,我需要爲每個唯一的薪水值取一個完整的行。基於非唯一列的唯一值獲取完整行

請讓我知道可能有用的查詢。

數據庫的樣本:

a b  c d  e f 

17 IL11 53 IL11 48 58 
26 IL10 53 IL10 48 58 
31 IL15 53 IL15 48 58 
32 IL16 53 IL16 24 58 
33 IL17 53 IL17 36 58 
34 IL18 53 IL18 36 58 
37 IL21 53 IL21 36 58 
40 IL24 53 IL24 48 58 

我想在E列過濾此(假設它是薪酬領域)

+0

一個完整的行對應於所有獨特的薪水,不只是一個 – rahulritesh

+0

你只需要那些具有不重複其他地方的工資行? –

+0

是的!只有那些在該字段 – rahulritesh

回答

1

不能確定這是否是更好的性能明智的,因爲沒有模式。但這應該工作。

WITH Emp_Salary 
AS 
(
    SELECT 
     Column1 
     , Column2 
     , Salary 
     , ROW_NUMBER() OVER (PARTITION BY Salary ORDER BY Column1) r --numbers each row uniquely per salary 
     FROM emp_details 
) 
SELECT 
    Column1 
    , Column2 
    , Salary 
FROM Emp_Salary 
WHERE r = 1 -- Filters all but the first row per salary. 
; 
+0

無效的列名'r'是我得到的 – rahulritesh

+0

我的錯誤,外部查詢不是引用CTE。現在更正了 –

+0

我懷疑這是OP想要的。對於OP:如果坦率賺100美元,皮特賺100美元,這將返回一個記錄(坦率或皮特取決於命令的條款)。 –

0

select distinct salary from emp_details會給你一系列的薪水值。

要獲得其他行...你想如何選擇你想要的行?

,如果你有ID的PK,你可以做

select * from emp_details where id in ( select Max(id),Salary from emp_details group by salary )

+0

沒有PK: -/ – rahulritesh

1
SELECT 
    * 
FROM 
    emp_details 
WHERE 
    Salary IN(
       SELECT 
        Salary 
       FROM 
        emp_details 
       GROUP BY 
        Salary 
       HAVING 
        COUNT(*) = 1 
      ) 
+0

結果只有1行! – rahulritesh

+1

@rahulritesh - 我們無法看到您的數據,但聲明是正確的。這意味着在整個表格中只有**一個**獨特的薪水。 –

+0

對不起,但正如我所說,在這個領域有多個獨特的薪水 – rahulritesh

0

你不應該使用IN操作符,如果你的內部查詢將返回多行。 此外,count(*)將比count(id)慢很多。

這一條可能會更快:

SELECT emp.* 
    FROM emp_details emp 
    WHERE exists (SELECT a 
        from emp_details 
        where e = emp.e 
        group by e 
         having count(a) = 1 
       );