例如,我有一个包含count的Product表,但我希望仅显示前3个产品的值(基于它们的count之和)。
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品1| 2022年12月1日|二百|
| 产品1| 2022年12月2日|二百|
| 产品二|2022年12月1日|二百|
| 产品二|2022年12月3日|五百个|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品四|2022年12月1日|100个|
| 产品四|2022年12月3日|100个|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
根据上述示例,每个产品的总和为:产品1 - 400产品2 - 700产品3 - 900产品4 - 200产品5 - 1,500
我只想显示前3个产品(产品5、3和2)的值。
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品二|2022年12月1日|二百|
| 产品二|2022年12月3日|五百个|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
我过去总是先检查计数总和最大的乘积,这样我就可以将结果用作表的筛选器。但我只想使用1个SQL查询,而不是运行2个单独的查询。
SELECT product, count(value) as prod_count
FROM product
GROUP BY product
ORDER BY prod_count
LIMIT 3
2条答案
按热度按时间fgw7neuy1#
我们可以用
SUM
(而不是COUNT
)表示值,用GROUP BY
表示乘积。这里我们可以使用
FETCH FIRST 3 ROWS WITH TIES
来查找例如具有相同的第三高和的两个乘积。因此,整个查询将是这样一个:
我们应该提到,如果可能的话,应该改进列/表命名,因为具有相同的表名和列名“product”会导致可读性差。
此外,列“date”(实际上是一个SQL关键字)最好重命名为更有意义的名称,例如“sellDate”,列“value”也是如此。
无论如何,让我们假设有另一个产品“产品6”,它具有与产品2相同的求和值(700)。
那么上面的查询将产生以下结果:
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品二|2022年12月1日|二百|
| 产品二|2022年12月3日|五百个|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
| 产品6| 2022年12月1日|六百|
| 产品6| 2022年12月10日|100个|
如果不打算显示四个产品(如果更多产品具有相同的第三高值总和,则显示更多产品),则可以使用
LIMIT 3
代替:因此,我们将再次得到仅三个产品,将不选择求和值为700的那些产品中的一个(这里为产品2)。
因此,此查询的结果将是:
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
| 产品6| 2022年12月1日|六百|
| 产品6| 2022年12月10日|100个|
或者,如果我们甚至想说应该找到产品2而不是产品6,我们可以将产品添加到
ORDER BY
子句中:这将是此查询的结果:
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品二|2022年12月1日|二百|
| 产品二|2022年12月3日|五百个|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
我们可以在这里试试:db<>fiddle
bfnvny8b2#
您可以在链接至数据表的汇总查询中使用
DENSE_RANK
函数,如下所示:请参见demo。