我有这个文件表(这里是简化版):
+------+-------+--------------------------------------+
| id | rev | content |
+------+-------+--------------------------------------+
| 1 | 1 | ... |
| 2 | 1 | ... |
| 1 | 2 | ... |
| 1 | 3 | ... |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)
如何为每个id选择一行并且只选择最大转速?
使用上面的数据,结果应该包含两行:[1, 3, ...]和[2, 1, ..].我正在使用MySQL.
目前,我在while循环中使用检查来检测并覆盖结果集中的旧转速.但这是实现结果的唯一方法吗?是不是有SQL解决方案?
更新
作为答案提示,有是一个SQL的解决方案,并且这里sqlfiddle演示.
更新2
我注意到在添加上述sqlfiddle之后,问题被投票的速率超过了答案的upvote率.那不是故意的!小提琴是基于答案,特别是接受的答案.
mysql sql aggregate-functions greatest-n-per-group groupwise-maximum
表:
UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)
我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)
更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.
以下查询:
SELECT
year, id, rate
FROM h
WHERE year BETWEEN 2000 AND 2009
AND id IN (SELECT rid FROM table2)
GROUP BY id, year
ORDER BY id, rate DESC
Run Code Online (Sandbox Code Playgroud)
收益率:
year id rate
2006 p01 8
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2009 p01 4.4
2002 p01 3.9
2004 p01 3.5
2005 p01 2.1
2000 p01 0.8
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7
2006 p02 …Run Code Online (Sandbox Code Playgroud) MySQL是否有一种很好的方式来复制SQL Server功能ROW_NUMBER()?
例如:
SELECT
col1, col2,
ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3 DESC) AS intRow
FROM Table1
Run Code Online (Sandbox Code Playgroud)
然后,我可以,例如,添加一个限制intRow为1 的条件,以获得col3每(col1, col2)对最高的单行.
以下是最简单的可能示例,但任何解决方案都应该能够扩展到需要的n个顶级结果:
根据下面的表格,使用人员,组和年龄列,您将如何获得每组中最老的2个人?(组内的关系不应该产生更多结果,但按字母顺序给出前2个)
+--------+-------+-----+ | Person | Group | Age | +--------+-------+-----+ | Bob | 1 | 32 | | Jill | 1 | 34 | | Shawn | 1 | 42 | | Jake | 2 | 29 | | Paul | 2 | 36 | | Laura | 2 | 39 | +--------+-------+-----+
期望的结果集:
+--------+-------+-----+ | Shawn | 1 | 42 | | Jill | 1 | 34 | | Laura | 2 | 39 | | …
我试图复制的逻辑显示在这里.但是,当有连接时,我没有运气.以下是我的查询的最小化版本:
SELECT resources.title, catRel.catRef
FROM resources
LEFT JOIN placesRel ON placesRel.refId = resId
LEFT JOIN catRel ON refId = resId
WHERE ...
Run Code Online (Sandbox Code Playgroud)
简而言之,我得到一个包含类别ID的列表,我希望将结果限制为不超过一个类别的n个结果,例如,每个catRef只显示两个结果:
title catRef
Swizz Gubbinz 1
Runcible Spoons 1
Peter Pan DVD 2
Button Moon 2
Monkey Alan 3
Bilge Pump 3
Run Code Online (Sandbox Code Playgroud) 我有两个表:"服务器"和"统计数据"
服务器有一个名为"id"的列,可以自动递增.stats有一个名为"server"的列,对应于servers表中的一行,一个名为"time"的列表示它被添加的时间,还有一个名为"votes"的列,我希望得到它的平均值.
我想获取所有服务器(SELECT * FROM servers)以及与每个服务器对应的24个最新行的平均投票.我相信这是一个"每组最大的"问题.
这是我尝试做的,但它总共给了我24行,而不是每组24行:
SELECT servers.*,
IFNULL(AVG(stats.votes), 0) AS avgvotes
FROM servers
LEFT OUTER JOIN
(SELECT server,
votes
FROM stats
GROUP BY server
ORDER BY time DESC LIMIT 24) AS stats ON servers.id = stats.server
GROUP BY servers.id
Run Code Online (Sandbox Code Playgroud)
就像我说的,我想为每个服务器获取最近24行,而不是最近24行.
I've got to execute a self-joining sql statement on a derived table in mysql. The derived table involves a hairy subquery, and I'm wondering if there's any alternative to actually writing and executing it twice-
SELECT a.* FROM (my hairy subquery) AS a
LEFT JOIN (my hairy subquery) AS a2
ON a.groupname = a2.groupname etc..
Run Code Online (Sandbox Code Playgroud) 我是在 postgresql 和一般情况下编写存储函数的新手。我正在尝试使用输入参数写入 onw 并返回一组存储在临时表中的结果。我在我的函数中执行以下操作。1) 获取所有消费者的列表并将他们的 id 存储在临时表中。2)迭代特定表并从上述列表中检索与每个值对应的值并存储在临时表中。3)返回临时表。
这是我自己尝试编写的函数,
create or replace function getPumps(status varchar) returns setof record as $$ (setof record?)
DECLARE
cons_id integer[];
i integer;
temp table tmp_table;--Point B
BEGIN
select consumer_id into cons_id from db_consumer_pump_details;
FOR i in select * from cons_id LOOP
select objectid,pump_id,pump_serial_id,repdate,pumpmake,db_consumer_pump_details.status,db_consumer.consumer_name,db_consumer.wenexa_id,db_consumer.rr_no into tmp_table from db_consumer_pump_details inner join db_consumer on db_consumer.consumer_id=db_consumer_pump_details.consumer_id
where db_consumer_pump_details.consumer_id=i and db_consumer_pump_details.status=$1--Point A
order by db_consumer_pump_details.consumer_id,pump_id,createddate desc limit 2
END LOOP;
return tmp_table
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我的方法,以及我是否在上面的代码中标记的 A 点和 B …
在过去的 4 个小时里,我一直专注于这个问题,简而言之,我想按 id 以 DESC 顺序排序该表,按 ads_post_id 分组(基于 id 的 DESC 顺序),LIMIT 为 6行返回。
数据库样本,
id | ads_post_id
---------------------------------------------------------------------------
22 | 983314845117571
23 | 983314845117571
24 | 983314845117571
104 | 983314845117571
250 | 983314845117571
253 | 983314845117571
767 | 983314845117571
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我目前的查询,
SELECT * FROM fb_ads GROUP BY ads_post_id ORDER BY id DESC LIMIT 6
Run Code Online (Sandbox Code Playgroud)
然而,这一切的回报是,
id | ads_post_id
---------------------------------------------------------------------------
22 | 983314845117571
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
它应该返回,
id | ads_post_id
---------------------------------------------------------------------------
767 | 983314845117571
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
很明显,它是按 ASC 顺序分组的,然后按 …