标签: greatest-n-per-group

SQL Server - 每个状态提取X个随机记录

我有一张表,其中包含美国每个邮政编码的记录.为了在地图上显示,我需要为每个州选择X个随机记录.我该怎么做呢?

sql t-sql sql-server sql-server-2005 greatest-n-per-group

10
推荐指数
1
解决办法
1344
查看次数

MySql每组中的第二小元素

我有一个类似于以下的表:

    date    |   expiry
-------------------------    
2010-01-01  | 2010-02-01
2010-01-01  | 2010-03-02
2010-01-01  | 2010-04-04
2010-02-01  | 2010-03-01
2010-02-01  | 2010-04-02
Run Code Online (Sandbox Code Playgroud)

在表中,每个日期可能有多个"到期"值.我需要一个返回每个日期中第n个最小到期的查询.例如,对于n = 2,我希望:

     date    |   expiry
-------------------------       
2010-01-01  | 2010-03-02
2010-02-01  | 2010-04-02
Run Code Online (Sandbox Code Playgroud)

我的麻烦是AFAIK,没有聚合函数返回第n个最大/最小元素,所以我不能使用'GROUP BY'.更具体地说,如果我有一个神奇的MIN()聚合接受第二个参数'offset',我会写:

SELECT MIN(expiry, 1) FROM table WHERE date IN ('2010-01-01', '2010-02-01') GROUP BY date
Run Code Online (Sandbox Code Playgroud)

有什么建议?

mysql group-by aggregate greatest-n-per-group

10
推荐指数
1
解决办法
2665
查看次数

MySQL - 连接表,仅检索Max ID

我已经在其他帖子上看到了类似的解决方案,但我一直在将问题应用于我的具体问题.

这是我最初的加入:

SELECT service_note_task, comment_id, comment FROM service_note_task LEFT JOIN service_note_task_comments ON service_note_task.service_note_task_id = service_note_task_comments.service_note_task_id;  
Run Code Online (Sandbox Code Playgroud)

结果如下:

+-----------------------------+------------+--------------+
| service_note_task           | comment_id | comment      |
+-----------------------------+------------+--------------+
| This is service note task 3 |         25 | Comment      |
| This is service note task 3 |         26 | Comment Blah |
| This is service note task 3 |         36 | aaa          |
| This is service note task 2 |         13 | Awesome comm |
| This is service note …
Run Code Online (Sandbox Code Playgroud)

sql max greatest-n-per-group

10
推荐指数
1
解决办法
1万
查看次数

从每个组中选择前1行

我有一个表,列出了已安装的软件版本:

id  | userid | version | datetime
----+--------+---------+------------------------
111 | 75     | 10075   | 2013-03-12 13:40:58.770
112 | 75     | 10079   | 2013-03-12 13:41:01.583
113 | 78     | 10065   | 2013-03-12 14:18:24.463
114 | 78     | 10079   | 2013-03-12 14:22:20.437
115 | 78     | 10079   | 2013-03-12 14:24:01.830
116 | 78     | 10080   | 2013-03-12 14:24:06.893
117 | 74     | 10080   | 2013-03-12 15:31:42.797
118 | 75     | 10079   | 2013-03-13 07:03:56.157
119 | 75     | 10080   | 2013-03-13 …
Run Code Online (Sandbox Code Playgroud)

sql group-by greatest-n-per-group sql-server-2012

10
推荐指数
3
解决办法
4万
查看次数

每组最新N条记录的平均值

我当前的应用程序根据每个用户的所有记录计算点平均值:

SELECT `user_id`, AVG(`points`) AS pts 
FROM `players` 
WHERE `points` != 0 
GROUP BY `user_id`
Run Code Online (Sandbox Code Playgroud)

业务需求已更改,我需要根据每个用户的最近30条记录计算平均值.

相关表格具有以下结构:

桌子:球员; 列:player_id,user_id,match_id,points

表:用户; columns:user_id

以下查询不起作用,但它确实演示了我尝试实现的逻辑.

SELECT @user_id := u.`id`, (
    -- Calculate the average for last 30 records
    SELECT AVG(plr.`points`) 
    FROM (
        -- Select the last 30 records for evaluation
        SELECT p.`points` 
        FROM `players` AS p 
        WHERE p.`user_id`=@user_id 
        ORDER BY `match_id` DESC 
        LIMIT 30
    ) AS plr
) AS avg_points 
FROM `users` AS u
Run Code Online (Sandbox Code Playgroud)

是否有一种相当有效的方法来根据每个用户的最新30条记录计算平均值?

mysql average greatest-n-per-group limit-per-group

10
推荐指数
2
解决办法
8960
查看次数

从每组的第一行和最后一行获取值

我是Postgres的新手,来自MySQL,并希望你们中的一个能够帮助我.

我有三列的表:name,week,和value.此表记录了名称,记录高度的周数以及高度值.像这样的东西:

Name  |  Week  | Value
------+--------+-------
John  |  1     | 9
Cassie|  2     | 5
Luke  |  6     | 3
John  |  8     | 14
Cassie|  5     | 7
Luke  |  9     | 5
John  |  2     | 10
Cassie|  4     | 4
Luke  |  7     | 4
Run Code Online (Sandbox Code Playgroud)

我想要的是每个用户的最小周和最大周值的列表.像这样的东西:

Name  |minWeek | Value |maxWeek | value
------+--------+-------+--------+-------
John  |  1     | 9     | 8      | 14
Cassie|  2     | 5     | 5 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql group-by aggregate greatest-n-per-group

10
推荐指数
2
解决办法
1万
查看次数

每周汇总最近加入的记录

updates在Postgres 有一张表是9.4.5像这样:

goal_id    | created_at | status
1          | 2016-01-01 | green
1          | 2016-01-02 | red
2          | 2016-01-02 | amber
Run Code Online (Sandbox Code Playgroud)

和这样的goals表:

id | company_id
1  | 1
2  | 2
Run Code Online (Sandbox Code Playgroud)

我想为每家公司创建一个图表,每周显示所有目标的状态.

示例图表

我想这需要生成一系列过去8周,找到该周之前的每个目标的最新更新,然后计算找到的更新的不同状态.

到目前为止我所拥有的:

SELECT EXTRACT(year from generate_series) AS year, 
       EXTRACT(week from generate_series) AS week,
       u.company_id,
       COUNT(*) FILTER (WHERE u.status = 'green') AS green_count,
       COUNT(*) FILTER (WHERE u.status = 'amber') AS amber_count,
       COUNT(*) FILTER (WHERE u.status = 'red') AS red_count
FROM generate_series(NOW() - INTERVAL '2 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql greatest-n-per-group

10
推荐指数
1
解决办法
387
查看次数

MYSQL查询 - 获取与帖子相关的最新评论

我正在尝试获取与我下载的每个帖子相关的最新1或2条评论,有点像instagram,因为它们显示每个帖子的最新3条评论,到目前为止我收到的帖子和喜欢的数量.

现在我需要做的就是弄清楚如何获得最新的评论,不太确定如何处理它,这就是为什么我希望有更多专业知识的人可以帮助我!

这是我目前的查询:

(SELECT
        P.uuid,
        P.caption,
        P.imageHeight,
        P.path,
        P.date,
        U.id,
        U.fullname,
        U.coverImage,
        U.bio,
        U.username,
        U.profileImage,
        coalesce(Activity.LikeCNT,0),
        Activity.CurrentUserLiked
        FROM USERS AS U
        INNER JOIN Posts AS P 
        ON P.id = U.id
        LEFT JOIN (SELECT COUNT(DISTINCT Activity.uuidPost) LikeCNT, Activity.uuidPost, Activity.id, sum(CASE WHEN Activity.id = $id then 1 else 0 end) as CurrentUserLiked
        FROM Activity Activity
        WHERE type = 'like' 
        GROUP BY Activity.uuidPost) Activity
        ON Activity.uuidPost = P.uuid
        AND Activity.id = U.id
        WHERE U.id = $id)
UNION
        (SELECT 
        P.uuid,
        P.caption,
        P.imageHeight,
        P.path,
        P.date, …
Run Code Online (Sandbox Code Playgroud)

php mysql sql greatest-n-per-group

10
推荐指数
1
解决办法
1102
查看次数

团体内的订单?

在我的系统中,我有客户.客户有程序.我想显示一个客户列表,显示它们最近的活动(如果存在)程序.

因此,我们有这样的事情:

SELECT * 
FROM clients AS client 
    JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
Run Code Online (Sandbox Code Playgroud)

close_date=0表示该程序未关闭.因此,它将把非封闭程序放在第一位,然后是最近关闭的程序.

问题是,订单在组内不起作用.它只是随机选择其中一个程序.我该如何解决这个问题?


刚想出来:

SELECT * 
FROM clients AS client 
    JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
Run Code Online (Sandbox Code Playgroud)

这似乎给出了正确的结果.这是正确的,还是我很幸运?也就是说,我在加入之前基本上对表格进行了排序; 这些结果会像加入一样保持排序,对吧?


解决方案:我现在相信这是一个典型的分组最大问题.如果您遇到类似问题,请搜索该问题.该解决方案涉及两次加入同一个表.

mysql greatest-n-per-group

9
推荐指数
1
解决办法
8042
查看次数

MySQL返回连接表的第一行

我有两个表(country和ducks),其中country表包含世界上的每个国家/地区,ducks表中有一个duckd列表,其中country_id字段链接到主国家/地区.

我正在试图获得一个只有至少有一只鸭子的国家名单,并且该鸭子表中的单一匹配记录是该国家中评级最高的鸭子.到目前为止,我有:

SELECT *
FROM country c 
INNER JOIN ducks d ON c.id = d.country_id
ORDER BY c.country ASC, d.rating DESC
Run Code Online (Sandbox Code Playgroud)

这将返回每个鸭子的列表,而不是每个国家只有一个.

如果有人能指出我正确的方向,我将不胜感激.我宁愿在SQL中执行它而不是为每个国家单独查询以获得最高评级的鸭子.

php mysql sql join greatest-n-per-group

9
推荐指数
2
解决办法
9307
查看次数