与order by子句不同

时间:2011-04-05 12:40:14

标签: sql select

我想通过curdate列获得不同的类别和订单结果。

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

但是这个简单的查询会产生错误。

如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。

6 个答案:

答案 0 :(得分:6)

我担心SELECT DISTINCTGROUP BY子句的约束相同:即,你不能使用未在字段列表中声明的字段,因为它根本不会知道在排序时要使用哪个curdate,以防有多个行具有相同curdate的不同Category值。

编辑:尝试类似:

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

用MIN替换MAX或任何适合你的人。

EDIT2:在这种情况下,MAX(curdate)甚至不必出现在字段列表中,因为它在聚合函数中使用。

答案 1 :(得分: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)

答案 2 :(得分: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]

答案 3 :(得分:0)

Curdate也必须在您的select语句中,此时您只需指定Category

答案 4 :(得分:0)

正如错误消息所述,您无法使用SELECT DISTINCT与未选中的列进行排序(与GROUP BY相同的问题...)。将您的查询更改为:

SELECT DISTINCT category, curdate FROM sizes ORDER BY curdate DESC

编辑:回复你的评论:
如果要选择具有每个类别的最后日期的不同类别,则必须稍微更改您的查询。我可以想到两种可能性:使用像Costi Ciudatu这样的MAX()或用子选择做一些疯狂的东西 - 第一种是更好的方法。

答案 5 :(得分:0)

错误说明的是,如果排序字段不是select的一部分,则无法排序不同的列表。原因是所选择的每个不同值可能有多个排序值。如果数据看起来像这样

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

AA应该在不同列表中的BBB之前还是之后?如果您只是在没有明确的日期之前订购,那么您将在两个位置获得它。由于SQL不知道哪个日期应该与不同的类别相关联,因此它不允许您按日期排序。