< PostgreSQL>如何仅根据计数最多的字段获取表中的所有列?

pu82cl6c  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(132)

例如,我有一个包含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
fgw7neuy

fgw7neuy1#

我们可以用SUM(而不是COUNT)表示值,用GROUP BY表示乘积。
这里我们可以使用FETCH FIRST 3 ROWS WITH TIES来查找例如具有相同的第三高和的两个乘积。
因此,整个查询将是这样一个:

SELECT product, date, value 
FROM product 
WHERE product IN 
(SELECT product
FROM product
GROUP BY product
ORDER BY SUM(value) DESC 
FETCH FIRST 3 ROWS WITH TIES)
ORDER BY product, date;

我们应该提到,如果可能的话,应该改进列/表命名,因为具有相同的表名和列名“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代替:

SELECT product, date, value 
FROM product 
WHERE product IN 
(SELECT product
FROM product
GROUP BY product
ORDER BY SUM(value) DESC 
LIMIT 3)
ORDER BY product, date;

因此,我们将再次得到仅三个产品,将不选择求和值为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子句中:

SELECT product, date, value 
FROM product 
WHERE product IN 
(SELECT product
FROM product
GROUP BY product
ORDER BY SUM(value) DESC, product 
LIMIT 3)
ORDER BY product, date;

这将是此查询的结果:
| 产品名称|日期|数值|
| - -|- -|- -|
| 产品二|2022年12月1日|二百|
| 产品二|2022年12月3日|五百个|
| 产品三|2022年12月4日|三百|
| 产品三|2022年12月8日|六百|
| 产品五|2022年12月1日|七百|
| 产品五|2022年12月10日|八百|
我们可以在这里试试:db<>fiddle

bfnvny8b

bfnvny8b2#

您可以在链接至数据表的汇总查询中使用DENSE_RANK函数,如下所示:

Select P.Product, P.Date, P.Value
From Product P Join
(
  Select Product,
         DENSE_RANK() Over (Order By Sum(Value) Desc) rn
  From Product
  Group By Product
) T
On P.Product = T.Product
Where T.rn <= 3
Order By P.Product, P.Date

请参见demo

相关问题