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不是函数。您只需将括号添加到列 nameselect 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 回答