我表中的值不同

时间:2013-02-16 15:09:08

标签: sql oracle

说我有一个包含以下列和记录的表

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子句,我也只需要不同的名称。请帮助我。

2 个答案:

答案 0 :(得分:1)

DISTINCT NOT 是一个功能。您只需将paranthesises添加到列名称即可。它与select name, result ...select (name), result ...

之间的差异基本相同

这是一个在完整行上运行的运算符。因此,你得到了所有的行,因为名称,结果,日期的组合总是不同的(顺便说一句。date是一个列的可怕名称。不仅因为它是一个保留字,而且因为它没有' t 文件列中的内容。是生日吗?终止日期?开始日期?结束日期?......)。

如果您只想要每个名称的最新日期,则需要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;

答案 1 :(得分: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;

希望这有帮助。