2011-12-29 10 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がそのレコードを選択する場合には、従業員が複数のSレコードを持っている場合

従業員は何のPレコードを持っていない場合は、S
を選択 、下のレコード番号を選択しますか、部門は400ではありませんという記録(400行が常に高いレコード番号になります)
を選択するだけで1つのSレコード、および部門がある場合は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の左側部分は十分である)

しかし、これはスタートのポイントです。(私はOR後に一部を棄却)

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

下位レコード番号/ not dept 400に関するORは、情報のためだけにありました。あなたは正しい、左はそれに十分です。 私はあなたの選択をちょっと試してみるつもりです(私は今、別の問題で膝が深いです)。 – Michelle

0

は、あなたのデータはフローリンの回答作品@そして、employeNumber内の重複TYPEとrecordNumber値を持つことができない場合。それ以外の場合、分析関数のORDER BYが同じランクの2つの行を生成する可能性がある場合は、再度重複する行を取得します。私の代わりに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を使用すると、従業員12に2行が与えられます。もちろん、このようなことが起こらないようにするには、クエリでその事実を報告することをお勧めします。

関連する問題