2011-12-29 84 views
3

我有一些麻煩,找出我需要從我的查詢輸出正確的語法。極限行輸出

這裏是我的數據(沒有這些都不是正確的列名,我試圖使它更容易閱讀)我是從拉動實際的表有數據的26列。

employeeNumber - recordNumber - job    - dept - type 
12   - 1   - stapler   - 788 - s 
12   - 6   - paper pusher  - 400 - s 
18   - 2   - phone cleaner  - 600 - p 
18   - 4   - sweeper   - 567 - s 
19   - 0   - typist    - 400 - s 
21   - 0   - mouse ball cleaner - 400 - p 

因此,這裏有評選規則:
如果類型爲P選擇記錄
如果員工有沒有P紀錄,選S
如果員工有多個S記錄,選擇較低的記錄號或選擇該記錄的部門是不是400(400行將始終是更高的記錄號)
如果只有一個的紀錄,而部門是400行應退還

這是什麼是目前的工作:

SELECT employeeNumber, recordNumber, job, dept, type 
FROM employees 
WHERE (type = 'P') 
OR 
(type = 'S' 
      AND employeeNumber NOT IN 
       (
        SELECT employeeNumber 
        FROM employees 
        WHERE type = 'P' 
       ) 
) 
ORDER BY employeeNumber, recordNumber 

,我希望做的就是把什麼「限制= 1」(或類似的東西)末,使多個S行的情況下,下recordNumber會爲在行回。

這是應該從上面的數據可以返回記錄集:

employeeNumber - recordNumber - job    - dept - type 
12   - 1   - stapler   - 788 - s 
18   - 2   - phone cleaner  - 600 - p 
19   - 0   - typist    - 400 - s 
21   - 0   - mouse ball cleaner - 400 - p 

清除泥漿,對不對?

我不斷收到錯誤。有沒有一種「簡單」的方式來做到這一點,我只是失蹤?

感謝您提供任何幫助。

米歇爾

回答

1

我不undestood很好的這一部分:

選擇較低的記錄編號或選擇的部門是 不是400(400行永遠是高記錄記錄號)

(如「400行永遠是更高的記錄號」,那麼OR的左邊部分就足夠了)

然而,這是開始的一個點。(I或解僱後的部分)

SELECT * FROM (
    SELECT employeeNumber, recordNumber, job, dept, type 
    rank() over (partition by employeeNumber order by type, recordNumber) as rnk 
    FROM employees 
) 
WHERE type = 'P' or (rnk=1 and type=S) 
+0

關於較低的記錄號/不是部門400的OR只是在那裏的信息。你是對的,剩下的就足夠了。 我會給你一個嘗試一點(我現在正在深陷另一個問題。) – Michelle 2011-12-29 16:51:28

0

如果數據不能有重複的類型和recordNumber值的employeNumber內,然後@林的回答作品。否則,如果您的ORDER BY在分析函數中有任何可能產生具有相同級別的兩行,您將再次獲得重複行。我會用ROW_NUMBER,而是和WHERE子句可以簡化爲簡單地選擇爲1的行號(你可以用@林的查詢做的一樣好)的所有行:

CREATE TABLE employees (employeeNumber INTEGER, recordNumber INTEGER 
      , job VARCHAR2(100), dept INTEGER, TYPE VARCHAR2(2)); 

INSERT INTO employees VALUES (12, 6, 'paper pusher', 400, 'S'); 
INSERT INTO employees VALUES (18, 2, 'phone cleaner', 600, 'P'); 
INSERT INTO employees VALUES (18, 4, 'sweeper', 567, 'S'); 
INSERT INTO employees VALUES (19, 0, 'typist', 400, 'S'); 
INSERT INTO employees VALUES (21, 0, 'mouse ball cleaner', 400, 'P'); 
INSERT INTO employees VALUES (12, 1, 'stapler', 788, 'S'); 
INSERT INTO employees VALUES (12, 1, 'stapler2', 654, 'S'); 

SELECT employeeNumber, recordNumber, job, dept, type 
    FROM (SELECT employeeNumber, recordNumber, job, dept, type 
      , ROW_NUMBER() 
       OVER (PARTITION BY employeeNumber 
          ORDER BY type, recordNumber) rn 
      FROM employees) 
WHERE rn = 1; 

息率這樣的:

EMPLOYEENUMBER RECORDNUMBER JOB     DEPT TYPE 
-------------- ------------- -------------------- ----- ---- 
      12    1 stapler    788 S 
      18    2 phone cleaner   600 P 
      19    0 typist     400 S 
      21    0 mouse ball cleaner  400 P 

使用RANK與此數據將給予2行爲僱員12。當然,如果這不應該發生,也許你會希望你的查詢報告這個事實。