SELECT ProductID
FROM OrderLine_T
GROUP BY ProductID
ORDER BY COUNT(ProductID) DESC
我订购了这样的产品,但LIMIT
或ROWNUM
由于某种原因无效。我需要查询只有最常订购的产品。我使用Teradata,数据库名称是db_pvfc10_big。我很抱歉这个令人困惑的问题是我的第一个问题,也是我使用SQL的初学者
提前谢谢
答案 0 :(得分:1)
LIMIT
关键字是标准的MySQL特定扩展。
ROWNUM
是特定于Oracle的伪列。
因此,您可能会将LIMIT
和ROWNUM
视为“无法正常运作”,这肯定会有“某些原因”。
问题并未表明正在使用哪个 RDBMS ... MySQL,PostgreSQL,Oracle,SQL Server,DB2,Teradata等。
(注意:使用“不起作用”作为您观察到的行为的唯一描述是相当不精确的。
描述并不表示查询的执行是返回某种错误,还是查询正在执行并返回不期望的结果集。
您描述为“不起作用”的陈述甚至没有显示。
获得结果的一种ANSI标准SQL方法是使用标准MAX()
聚合获得“最大”值。一种方法是使用内联视图。例如:
SELECT MAX(s.cnt) AS max_cnt
FROM ( SELECT COUNT(t.productid) AS cnt
FROM orderline_t t
GROUP BY t.productid
) s
这也可以用作内联视图......
SELECT MAX(q.productid)
FROM ( SELECT MAX(s.cnt) AS max_cnt
FROM ( SELECT COUNT(t.productid) AS cnt
FROM orderline_t t
GROUP BY t.productid
) s
) r
JOIN ( SELECT p.productid
, COUNT(p.productid) AS cnt
FROM orderline_t p
GROUP BY p.product_id
) q
ON q.cnt = r.max_cnt
请注意,如果有两个或更多产品的订购次数相同“最大”次数,则此查询将只返回其中一个产品。
这应该适用于大多数关系数据库。
还有其他查询模式会返回相同的结果。
但是这个例子应该有助于解释为什么大多数RDBMS都提供SQL标准的扩展,这通常会使查询更简单。
MySQL“... ORDER BY ... LIMIT 1”
SQL Server“SELECT TOP 1 ...”
等
答案 1 :(得分:0)
您可以尝试在select语句中包含count(ProductID)。一些sql数据库使用关键字“top”而不是“limit”。因此,如果您正在使用其中一个(例如Teradata sql),请执行以下操作:
select top 1 ProductID, count(ProductID)
from OrderLine_T
group by ProductID
order by 2 desc;