正如标题所示,我想选择用a组成的每组行的第一行GROUP BY.
具体来说,如果我有一个purchases看起来像这样的表:
SELECT * FROM purchases;
Run Code Online (Sandbox Code Playgroud)
我的输出:
id | customer | total ---+----------+------ 1 | Joe | 5 2 | Sally | 3 3 | Joe | 2 4 | Sally | 1
我想查询每个产品id的最大购买量(total)customer.像这样的东西:
SELECT FIRST(id), customer, FIRST(total)
FROM purchases
GROUP BY customer
ORDER BY total DESC;
Run Code Online (Sandbox Code Playgroud)
预期产出:
FIRST(id) | customer | FIRST(total)
----------+----------+-------------
1 | Joe | 5
2 | Sally | 3
我有这个文件表(这里是简化版):
+------+-------+--------------------------------------+
| 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
有一个表messages包含如下所示的数据:
Id Name Other_Columns
-------------------------
1 A A_data_1
2 A A_data_2
3 A A_data_3
4 B B_data_1
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
如果我运行查询select * from messages group by name,我会得到如下结果:
1 A A_data_1
4 B B_data_1
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
什么查询将返回以下结果?
3 A A_data_3
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
也就是说,应返回每组中的最后一条记录.
目前,这是我使用的查询:
SELECT
*
FROM (SELECT
*
FROM messages
ORDER BY id DESC) AS x
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
但这看起来非常低效.还有其他方法可以达到相同的效果吗?
表:
UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)
我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)
更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.
我有一个用户登记和退出时间表("lms_attendance"),如下所示:
id user time io (enum)
1 9 1370931202 out
2 9 1370931664 out
3 6 1370932128 out
4 12 1370932128 out
5 12 1370933037 in
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个这个表的视图,它只输出每个用户ID的最新记录,同时给我"in"或"out"值,如下所示:
id user time io
2 9 1370931664 out
3 6 1370932128 out
5 12 1370933037 in
Run Code Online (Sandbox Code Playgroud)
我很接近,到目前为止,但我意识到,意见将不接受subquerys,这使其成为了很多困难.我得到的最接近的查询是:
select
`lms_attendance`.`id` AS `id`,
`lms_attendance`.`user` AS `user`,
max(`lms_attendance`.`time`) AS `time`,
`lms_attendance`.`io` AS `io`
from `lms_attendance`
group by
`lms_attendance`.`user`,
`lms_attendance`.`io`
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
id user time io
3 6 1370932128 out
1 9 1370931664 out
5 12 1370933037 in …Run Code Online (Sandbox Code Playgroud) 我在桌子下面
create table #t (Id int, Name char)
insert into #t values
(1, 'A'),
(2, 'A'),
(3, 'B'),
(4, 'B'),
(5, 'B'),
(6, 'B'),
(7, 'C'),
(8, 'B'),
(9, 'B')
Run Code Online (Sandbox Code Playgroud)
我想在name列中计算连续值
+------+------------+
| Name | Repetition |
+------+------------+
| A | 2 |
| B | 4 |
| C | 1 |
| B | 2 |
+------+------------+
Run Code Online (Sandbox Code Playgroud)
我尝试过的最好的事情是:
select Name
, COUNT(*) over (partition by Name order by Id) AS Repetition
from #t
order by Id
Run Code Online (Sandbox Code Playgroud)
但它没有给我预期的结果
我有两个表:tableA (idA, titleA)和tableB (idB, idA, textB)有一个在它们之间一对多的关系.对于tableA中的每一行,我想检索tableB中对应的最后5行(由idB排序).
我试过了
SELECT * FROM tableA INNER JOIN tableB ON tableA.idA = tableB.idA LIMIT 5
Run Code Online (Sandbox Code Playgroud)
但它只是限制了INNER JOIN的全局结果,而我想限制每个不同tableA.id的结果
我怎样才能做到这一点 ?
谢谢
我问了一个关于昨天做出"每组最大n"类型查询的问题(当时不知道它被称为"每组最大n"),除了我问如何获得每组最少的.表结构如下:
type name value
=====================
1 item1 1
1 item2 20
2 item3 0
3 item4 5
3 item5 2
3 item6 50
Run Code Online (Sandbox Code Playgroud)
我收到了几个很好的答案,最有帮助的是:
SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value
WHERE t2.value IS NULL
Run Code Online (Sandbox Code Playgroud)
以上查询结果如下:
type name value
=====================
2 item3 0
1 item1 1
3 item5 2
Run Code Online (Sandbox Code Playgroud)
然而,自从提出问题以来,我意识到我遗漏了一个重要的要求,我似乎无法弄清楚如何添加到上面的查询.我需要添加一个条件语句,而不是为每个组选择一个列值最小的行,而是为每个组选择一个列值最小的行,但是该行的另一个列的值大于某个列的值值.
这是我的新问题/问题:
我有下表(产品):
+-----------------------------------------------------------+
| id | type | name | popularity | price |
+-----------------------------------------------------------+
| …Run Code Online (Sandbox Code Playgroud) 我有以下 SQL 表,用于跟踪用户在特定时间点的分数。一个用户每天可以有多个分数。
+-------+------------+-------+-----+
| user | date | score | ... |
+-------+------------+-------+-----+
| bob | 2014-04-19 | 100 | ... |
| mary | 2014-04-19 | 100 | ... |
| alice | 2014-04-20 | 100 | ... |
| bob | 2014-04-20 | 110 | ... |
| bob | 2014-04-20 | 125 | ... |
| mary | 2014-04-20 | 105 | ... |
| bob | 2014-04-21 | 115 | ... |
+-------+------------+-------+-----+
Run Code Online (Sandbox Code Playgroud)
给定一个特定用户(比方说bob …
sql ×7
mysql ×6
group-by ×2
aggregation ×1
inner-join ×1
oracle ×1
postgresql ×1
sql-server ×1
sqlite ×1
t-sql ×1