我有一张表,其中包含美国每个邮政编码的记录.为了在地图上显示,我需要为每个州选择X个随机记录.我该怎么做呢?
我有一个类似于以下的表:
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)
有什么建议?
我已经在其他帖子上看到了类似的解决方案,但我一直在将问题应用于我的具体问题.
这是我最初的加入:
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) 我有一个表,列出了已安装的软件版本:
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) 我当前的应用程序根据每个用户的所有记录计算点平均值:
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条记录计算平均值?
我是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) 我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) 我正在尝试获取与我下载的每个帖子相关的最新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) 在我的系统中,我有客户.客户有程序.我想显示一个客户列表,显示它们最近的活动(如果存在)程序.
因此,我们有这样的事情:
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)
这似乎给出了正确的结果.这是正确的,还是我很幸运?也就是说,我在加入之前基本上对表格进行了排序; 这些结果会像加入一样保持排序,对吧?
解决方案:我现在相信这是一个典型的分组最大问题.如果您遇到类似问题,请搜索该问题.该解决方案涉及两次加入同一个表.
我有两个表(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中执行它而不是为每个国家单独查询以获得最高评级的鸭子.