2011-11-21 88 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