2011-11-21 93 views
0

我曾尝试使用下面的查询,但无法检索列status_id的不同值。如何从表中选择唯一值?

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

的上述查询的目的是为了筛选表在它需要对于本表中的所有列的值取同一时间得到列“status_id”的唯一值。以便我的决赛桌将包含status_id及其相应其他值的不同值。

+2

'distinct'适用于select中的所有列,而不仅仅是第一列。 –

+2

如果'status_id'有多个出现,并且只想出现一个匹配项,那么您如何选择将哪一行用于其余列? –

+0

是否有可能只为第一个图层进行过滤...... – Winz

回答

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就足够了。

不确定order by是强制性的。如果不是的话,你可以放弃它。如果是,您可以指定一个虚拟值或指定一个特定的字段作为“第一行”。例如,加速order by schedule_id以返回每个status_id的最低schedule_id。

+0

鉴于请求不可能如上所述完成,这是合理的尝试。 – Sorpigal

-2

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

使用GROUP BY,并对其他列使用组函数(MAX,MIN,WM_CONCAT您需要什么)。

或对于每列使用subqueriesprimary key

+1

这是错误的。如果你使用'min',你会得到最低的值。这意味着你可以得到一个与你在下一条记录中获得的cassay_id不同的记录的schedule_id。非常不可预测。使用分析函数生成编号并筛选出任何后续记录。 – GolezTrol

+0

是的,你是真的,我编辑了答案。谢谢。 –

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