说我有一个包含以下列和记录的表
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子句,我也只需要不同的名称。请帮助我。
答案 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;
希望这有帮助。