首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按年最高发生次数对事件进行排序

按年最高发生次数对事件进行排序
EN

Stack Overflow用户
提问于 2022-03-27 22:05:06
回答 2查看 52关注 0票数 0

我想找出每年发生多少件事。目前,我有这样的查询,这基本上是在事件有访问者时计算在内的:

代码语言:javascript
复制
SELECT 
count(visitors_y_2016) as y_16,
count(visitors_y_2017) as y_17,
count(visitors_y_2018) as y_18,
count(visitors_y_2019) as y_19, 
count(visitors_y_2020) as y_20
FROM event
;
代码语言:javascript
复制
y16  y17  y18  y19  y20 
23   25   26   27   19

但我想要的是一年中有更多事件的订单:

代码语言:javascript
复制
Y19 27
Y18 26
y17 25
y16 23
y20 19

知道怎么做到吗?

EN

回答 2

Stack Overflow用户

发布于 2022-03-27 22:53:57

您可以在VALUES子查询中使用LATERAL表达式“解除枢轴”:

代码语言:javascript
复制
SELECT t.*
FROM  (
   SELECT count(visitors_y_2016) AS y16
        , count(visitors_y_2017) AS y17
        , count(visitors_y_2018) AS y18
        , count(visitors_y_2019) AS y19 
        , count(visitors_y_2020) AS y20
   FROM   event
   ) e, LATERAL (
   VALUES
     (16, e.y16)
   , (17, e.y17)
   , (18, e.y18)
   , (19, e.y19)
   , (20, e.y20)
   ) t(year, count)
ORDER  BY count DESC;  -- your desired sort order

db<>fiddle https://dbfiddle.uk/?rdbms=postgres_14&fiddle=f40e145b4bf01926d1fe8eb93733733a

因为这只需要表上的单扫描,所以它比单独聚合输出值要快很多倍。

VALUES表达式中的每一行都由两列组成:year (数字默认值为integer)和count (引用列的类型)。

请参见:

关于LATERAL子查询:

但是你的桌子设计引起了问题。通常您有一个日期或时间戳列visitors,而不是visitors_y_2016visitors_y_2017等-以及基于此的更简单的查询……

票数 1
EN

Stack Overflow用户

发布于 2022-03-27 22:12:55

我不认为你每年都需要一个选择。我不太了解你的表,但是应该有一个更好的wayu来组织你的数据。另外,如果你想对数据排序的话,排序应该是你的朋友。您只需有一个选择就可以使用它,例如:

代码语言:javascript
复制
SORT BY
VISITOR_COUNT
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71640664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档