2011-04-05 98 views
0

我想獲得不同的類別和訂單由curdate列的結果。與訂單的區別與條款

select distinct(Category)'Category' from sizes order by curdate desc 

但是,這個簡單的查詢會產生錯誤。

如果指定了SELECT DISTINCT,則ORDER BY項目必須出現在選擇列表中。

回答

6

我怕你有同樣的約束對SELECT DISTINCTGROUP BY條款:即,你不能使用的字段這不是在字段列表中聲明的,因爲它只是不知道在排序時使用哪一個curdate,以防在同一Category中存在多個具有不同curdate值的行。

編輯:你可以試試:

SELECT Category FROM sizes GROUP BY Category ORDER BY MAX(curdate) DESC 

與MIN更換MAX或任何適合你。編輯2:在這種情況下,MAX(curdate)甚至不必在字段列表中出現,因爲它用於聚合函數。

0

CURDATE必須在SELECT語句還,現在你只指定類別

+0

如果我加入seelct條款CURDATE它不會返回不同的類別 – 2011-04-05 12:45:06

0

作爲錯誤消息說,你不能通過未選擇wehen的列使用SELECT DISTINCT(與GROUP BY相同的問題...)。改變你的查詢到這一點:

SELECT DISTINCT category, curdate FROM sizes ORDER BY curdate DESC 

編輯:回覆yourt評論:
,如果你要選擇與每個類別的最後日期的不同類別,你必須改變你的查詢了一下。我可以想到兩種可能性:使用MAX()(如發佈Costi Ciudatu)或使用子選擇做一些瘋狂的事情 - 第一種方法是更好的方法。

+0

如果我添加CURDATE在seelct條款不會返回不同的類別 – 2011-04-05 12:46:57

+0

返回,如預期,Category'和'的不同組合'CURDATE ' – oezi 2011-04-05 12:48:52

1

你看起來是所有類別的列表後,與每個類別的日期。無論你是想最早的第一或最新首先,你應該能夠執行下列操作之一:

SELECT Category, MAX(curdate) FROM sizes GROUP BY Category 

或者:

SELECT Category, MIN(curdate) FROM sizes GROUP BY Category 

根據您是否要在最近或最早的日期相關聯每個類別。如果您需要在列表中,然後通過日期是ORDER版,添加以下到結束的一個:

ORDER BY MAX(curdate) 
ORDER BY MIN(curdate) 
+0

應該按照類別而不是curdate – Rozwel 2011-04-05 12:51:02

+0

@Rozwel - d'oh!固定。 – Jaymz 2011-04-05 12:55:36

0

完全錯誤說什麼,它不能,如果提交的排序是沒有的一部分訂購不同的列表選擇。原因在於對於所選的每個不同值可能有多個排序值。如果數據看起來像這樣

Category CurDate 
AAA   1/1/2011 
BBB   2/1/2011 
AAA   3/1/2011 

AA應該在不同列表中的BBB之前還是之後?如果你只是在沒有明顯的日期的情況下訂購,你可以在兩個位置獲得。由於SQL不知道哪個日期應該與不同的類別相關聯,因此它不會讓您按日期排序。

1
with cte as 
(
    select 
    Category, 
    [CurDate], 
    row_number() over(partition by Category order by [CurDate]) as rn 
    from sizes 
) 
select 
    Category 
from cte 
where rn = 1 
order by [CurDate]