postgresql提取到每个组的最后一行

发布于 2025-02-12 08:44:30 字数 655 浏览 1 评论 0原文

我有以下数据

应用程序登录
SlackJenny2019-01-01
SlackJenny2020-01-01
SlackJenny2021-01-01
SlackYang2020-06-06
SlackYang Yang2021-06-06

,用于每个组应用程序和用户,用户,用户,用户,我需要获取最新的登录日期。我试图使用窗口功能,但无法获得我期望的结果:

SELECT app, people, LAST_VALUE(login) OVER (PARTITION BY app, people ORDER BY login)
FROM xxxxx

有什么建议吗?

I have the following data

apppeoplelogin
slackJenny2019-01-01
slackJenny2020-01-01
slackJenny2021-01-01
slackYang2020-06-01
slackYang2021-06-01

For each group app and user, I need to get the latest login date. I tried to use a window function, but could not get the result of what I am expecting:

SELECT app, people, LAST_VALUE(login) OVER (PARTITION BY app, people ORDER BY login)
FROM xxxxx

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌伤浅笑 2025-02-19 08:44:30

首先,从组中的最后一个值不需要窗口函数,只需选择不同的选择即可。我假设每个{appp,people}对必须仅在结果中显示一次。

select distinct on (app,people)
app, people, login from tab
order by app, people, login desc

391236DA9E56CF01A44444444444445B2C9159

SELECT 
  app, 
  people, 
  LAST_VALUE(login) OVER (
         PARTITION BY app, people 
         ORDER BY login ASC 
         RANGE BETWEEN UNBOUNDED PRECEDING AND 
                UNBOUNDED FOLLOWING)
FROM tab

”命令在窗口函数中使用,然后以“运行总和”模式运行窗口函数,仅了解已在分区内处理过的行。如果我们想从整个分区获取信息,那么我们必须明确指出。

在这种情况下,使用max看起来更好的选择(如@lemon指向)

SELECT 
   app, 
   people, 
   login,  
   MAX(login) OVER (PARTITION BY app, people)
FROM tab

To get first, last value from group there is no need for window function, just distinct select. I've assumed that each {appp, people} pair must be presented only once in results.

select distinct on (app,people)
app, people, login from tab
order by app, people, login desc

DB Fiddle

And example with LAST_VALUE

SELECT 
  app, 
  people, 
  LAST_VALUE(login) OVER (
         PARTITION BY app, people 
         ORDER BY login ASC 
         RANGE BETWEEN UNBOUNDED PRECEDING AND 
                UNBOUNDED FOLLOWING)
FROM tab

When ORDER BY is used inside window function then window function run in "running sum" mode, knowing only about rows already processed inside partition. If we want to get information from whole partition then we must explicitly point that.

In this case, using MAX looks like better choice (as @lemon pointed)

SELECT 
   app, 
   people, 
   login,  
   MAX(login) OVER (PARTITION BY app, people)
FROM tab
羁客 2025-02-19 08:44:30

您可以使用max窗口函数代替last_value窗口函数:

SELECT app, 
       people, 
       MAX(login) OVER (PARTITION BY app, people ORDER BY login DESC)
FROM tab

检查demo 在这里


相反,如果要汇总您的“ app ”和“ people ”值,上次登录值,也可以使用max contregation功能:

SELECT app, 
       people, 
       MAX(login)
FROM tab
GROUP BY app, 
         people

检查演示在这里

You can use the MAX window function in place of the LAST_VALUE window function:

SELECT app, 
       people, 
       MAX(login) OVER (PARTITION BY app, people ORDER BY login DESC)
FROM tab

Check the demo here.


Instead, if you want to aggregate your "app" and "people" values on the last login value, you can also use the MAX aggregation function:

SELECT app, 
       people, 
       MAX(login)
FROM tab
GROUP BY app, 
         people

Check the demo here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文