0

次の列とレコードを持つテーブルがあるとします

NAME            RESULT   DATE
----------------------------------------------
John            Pass    12-FEB-2013 18:03:55
Albert          Fail    12-FEB-2013 18:24:29
Chris           Pass    12-FEB-2013 18:24:28
John            Fail    12-FEB-2013 19:32:35
Chris           Pass    12-FEB-2013 19:32:35
Steve           Pass    12-FEB-2013 20:04:35

NAME列とは異なる値が必要な場合は、次のことを行いました

SELECT DISTINCT(NAME) FROM TABLE_NAME;

今私が次のことをしたら

SELECT DISTINCT(NAME), 
       RESULT, 
       DATE 
FROM TABLE_NAME 
WHERE TRUNC(DATE) = TRUNC(SYSDATE)-4;

名前列のすべてのレコードを取得します。しかし、すべてのレコードは必要ありません。上記の WHERE 句を使用しても、個別の名前のみが必要です。助けてください。

4

2 に答える 2

1

DISTINCT関数ではありません列名に括弧を追加しただけです。それは基本的に と の違いと同じselect name, result ...ですselect (name), result ...

行全体に作用する演算子です。そのため、名前、結果、日付の組み合わせが常に異なるため、すべての行を取得します (ところでdate列の恐ろしい名前です。予約語であるだけでなく、生年月日ですか? 終了日ですか? 開始日ですか? 終了日ですか? ...)。

たとえば、各名前の最新の日付のみが必要な場合は、次のものが必要ですgroup by

select name, 
       max(result) as result,
       max(trunc(date)) as dt
from table_name 
group by name;

これは必ずしも最大日付に属する結果を返すとは限らないことに注意してください。それが必要な場合は、次のようなものを検討してください。

select name, result, result_date
from (
    select name, 
           result,
           trunc(date) as result_date,
           row_number() over (partition by name order by date desc) as rn
    from table_name 
) t
where rn = 1;
group by name;
于 2013-02-16T15:29:04.647 に答える
0

あなたの質問は少し混乱しています。提供された基準DISTINCTを使用して名前を取得する場合は、次のようにします。WHERE

SELECT DISTINCT NAME 
FROM TABLE_NAME 
WHERE TRUNC(DATE) = TRUNC(SYSDATE)-4;

ただし、日付が切り捨てられた他のフィールドが必要な場合:

SELECT DISTINCT NAME, RESULT, TRUNC(DATE) dt
FROM TABLE_NAME 
WHERE TRUNC(DATE) = TRUNC(SYSDATE)-4;

または、フルタイムが必要な場合:

SELECT DISTINCT NAME, RESULT, DATE
FROM TABLE_NAME 
WHERE TRUNC(DATE) = TRUNC(SYSDATE)-4;

お役に立てれば。

于 2013-02-16T15:21:44.633 に答える