我想通过curdate列获得不同的类别和订单结果。
select distinct(Category)'Category' from sizes order by curdate desc
但是这个简单的查询会产生错误。
如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。
答案 0 :(得分:6)
我担心SELECT DISTINCT
与GROUP 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不知道哪个日期应该与不同的类别相关联,因此它不允许您按日期排序。