相关疑难解决方法(0)

选择每个GROUP BY组中的第一行?

正如标题所示,我想选择用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

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

1205
推荐指数
16
解决办法
95万
查看次数

SQL仅选择列上具有最大值的行

我有这个文件表(这里是简化版):

+------+-------+--------------------------------------+
| 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

1142
推荐指数
14
解决办法
107万
查看次数

如何通过SQL中的另一列选择MAX(列值),DISTINCT的行?

我的表是:

id  home  datetime     player   resource
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399 
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
3  | 10  | 03/03/2009 | john   | 300
4  | 11  | 03/03/2009 | juliet | 200
6  | 12  | 03/03/2009 | borat  | 500
7  | 13  | 24/12/2008 | borat  | 600
8  | 13  | 01/01/2009 | borat  | 700
Run Code Online (Sandbox Code Playgroud)

我需要选择每个不同的 …

mysql sql max distinct greatest-n-per-group

727
推荐指数
13
解决办法
142万
查看次数

获取具有列的最大值的行

表:

UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)

我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)

更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.

sql oracle greatest-n-per-group

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

SQL连接:选择一对多关系中的最后一条记录

假设我有一张顾客表和一张购买表.每次购买都属于一个客户.我想在一个SELECT语句中获取所有客户的列表以及他们上次购买的列表.什么是最佳做法?有关构建索引的建议吗?

请在答案中使用这些表/列名称:

  • 顾客:身份证,姓名
  • 购买:id,customer_id,item_id,日期

在更复杂的情况下,通过将最后一次购买放入客户表中,是否(性能方面)有利于对数据库进行非规范化?

如果(购买)ID保证按日期排序,是否可以通过使用类似的方式简化语句LIMIT 1

sql indexing select join greatest-n-per-group

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

MySQL之前按顺序排序

这里有很多类似的问题,但我认为没有充分回答这个问题.

我会从当前最流行的问题继续,并使用他们的例子,如果这没关系.

此实例中的任务是获取数据库中每个作者的最新帖子.

示例查询产生不可用的结果,因为它并不总是返回的最新帖子.

SELECT wp_posts.* FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author           
    ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)

目前接受的答案是

SELECT
    wp_posts.*
FROM wp_posts
WHERE
    wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
HAVING wp_posts.post_date = MAX(wp_posts.post_date) <- ONLY THE LAST POST FOR EACH AUTHOR
ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个答案简单明了,并且在很多情况下产生的结果不如原始查询那么稳定.

我最好的解决方案是使用表单的子查询

SELECT wp_posts.* FROM 
(
    SELECT * 
    FROM wp_posts
    ORDER BY wp_posts.post_date DESC
) AS wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author 
Run Code Online (Sandbox Code Playgroud)

我的问题是一个简单的问题: 无论如何在分组之前订购行而不诉诸子查询?

编辑:这个问题是另一个问题的延续,我的情况细节略有不同.您可以(并且应该)假设还有一个wp_posts.id,它是该特定帖子的唯一标识符.

mysql group-by sql-order-by

228
推荐指数
5
解决办法
31万
查看次数

如何删除MySQL表上的重复项?

我需要DELETEMySQL表上为指定的sid复制行.

如何使用SQL查询执行此操作?

DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"
Run Code Online (Sandbox Code Playgroud)

像这样的东西,但我不知道该怎么做.

mysql duplicates

154
推荐指数
12
解决办法
20万
查看次数

获取每组最高/最小<whatever>的记录

怎么做?

这个问题的前标题是" 在带有子查询的复杂查询中使用等级(@Rank:= @Rank + 1) - 它会起作用吗? "因为我正在寻找使用等级的解决方案,但现在我看到Bill发布的解决方案是好多了.

原始问题:

我正在尝试编写一个查询,该查询将根据定义的顺序从每个组获取最后一条记录:

SET @Rank=0;

select s.*
from (select GroupId, max(Rank) AS MaxRank
      from (select GroupId, @Rank := @Rank + 1 AS Rank 
            from Table
            order by OrderField
            ) as t
      group by GroupId) as t 
  join (
      select *, @Rank := @Rank + 1 AS Rank
      from Table
      order by OrderField
      ) as s 
  on t.GroupId = s.GroupId and t.MaxRank = s.Rank
order by OrderField
Run Code Online (Sandbox Code Playgroud)

表达式@Rank := @Rank + 1 …

mysql subquery rank greatest-n-per-group

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

MySQL在Group by之前订购

我需要找到每个作者的最新帖子,然后对结果进行分组,这样我每个作者只会发一个最新的帖子.

SELECT wp_posts.* FROM wp_posts
        WHERE wp_posts.post_status='publish'
        AND wp_posts.post_type='post'
        GROUP BY wp_posts.post_author           
        ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)

这是正确地对输出进行分组,因此我每个作者只获得一个帖子,但是在分组后将结果排序,而不是在选择之前.

mysql wordpress group-by sql-order-by

50
推荐指数
5
解决办法
4万
查看次数

如何使用GROUP BY获取每组中的最新记录?

假设我有一个messages用列调用的表:

id | from_id | to_id | subject | message | timestamp
Run Code Online (Sandbox Code Playgroud)

我想只收到每个用户的最新消息,就像您在深入了解实际线程之前在FaceBook收件箱中看到的那样.

这个查询似乎让我接近我需要的结果:

SELECT * FROM messages GROUP BY from_id
Run Code Online (Sandbox Code Playgroud)

但是,查询给了我每个用户最早的消息,而不是最新消息.

我无法想出这个.

mysql sql greatest-n-per-group

40
推荐指数
3
解决办法
9万
查看次数