2011-12-29 77 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。当然,如果这不应该发生,也许你会希望你的查询报告这个事实。