2011-04-05 56 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]