如何从表中选择唯一值?

时间:2011-11-21 22:06:48

标签: sql oracle

我曾尝试使用以下查询,但无法检索列status_id的不同值。

select distinct status_id, schedule_id, cassay_id, time_of_day,
                days, notify_to_addresses, active FROM ordertest

上述查询的目的是过滤表以获取列“status_id”的唯一值,同时需要获取表中存在的所有列的值。因此,我的最终表将包含status_id的不同值及其相应的其他值。

3 个答案:

答案 0 :(得分:0)

此查询返回唯一的status_id,但前提是这些status_id和其他每个字段的组合也是唯一的。您可以选择唯一的status_id,但如果每个status_id有多个组合,则无法返回其他字段的所有值。

[编辑]

如果您只希望每个状态的第一条记录:

select 
  status_id, schedule_id, cassay_id, time_of_day, days, notify_to_addresses, active 
from
  (select 
    row_number() over (partition by status_id order by 1) as number, 
    status_id, schedule_id, cassay_id, time_of_day, days, notify_to_addresses, active 
  FROM ordertest)
where
  number = 1

而不是row_numberdense_rankrank也用于不同类型的编号,但在这种情况下,您确实需要一行,而row_number就足够了。< / p>

不确定order by是强制性的。如果没有,你可以把它留下来。如果是,则可以指定虚拟值或指定要用作“第一行”的特定字段。例如,加速order by schedule_id以返回每个status_id的最低schedule_id。

答案 1 :(得分:0)

WITH DISTINCT_STATUS
AS
(
-- this one will query distinct status id values
   select DISTINCT status_id FROM ordertest
)
-- this query will give extra information in that rows.
select distinct T.status_id, T.schedule_id, T.cassay_id, T.time_of_day,
            T.days, T.notify_to_addresses, T.active 
FROM ordertest T 
INNER JOIN 
DISTINCT_STATUS DS
ON DS.status_id = T.status_id

答案 2 :(得分:-2)

DISTINCT适用于每一行,其他字段对于所有不同的status_id都不相同,因此您无法使用DISTINCT。

使用GROUP BY,并使用群组功能(MAX,MIN,WM_CONCAT 您需要什么)用于其他列。

或者subqueries为每列使用primary key