当前位置: 首页 > 面试题库 >

在分组内排序?

仲孙华奥
2023-03-14
问题内容

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

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

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

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

这似乎给出正确的结果。这是正确的,还是我很幸运?即,我基本上已经在对表进行排序之前对其进行了排序;这些结果将像连接一样保持排序,对吗?

解决方案:
我现在认为这是一个经典的基于组的最大问题。如果您遇到类似问题,请进行搜索。解决方案包括将同一张表连接两次。


问题答案:
SELECT  c.*, p.*
FROM    clients AS c
JOIN    programs AS p
ON      p.id = 
        (
        SELECT  pi.id
        FROM    programs AS pi
        WHERE   pi.client_id = c.id
        ORDER BY
                pi.close_date=0 DESC, pi.close_date DESC
        LIMIT 1
        )

谢谢 应该去
@Quassnoi
。在类似(但更复杂)的问题中查看他的答案: mysql-group-by-to-display-latest-
result


如果您更新programs表并将close_date所有零记录设置为close_date='9999-12-31',那么您ORDER BY会更简单(使用适当的索引,整个查询也会更快):

        ORDER BY
                pi.close_date DESC


 类似资料:
  • 我想将我的数据框按两列分组,然后对分组内的聚合结果进行排序。 现在,我想在每个组中按降序对count列进行排序。然后只取最上面的三排。要获得类似于:

  • 问题内容: 我需要找到每个作者的最新帖子,然后对结果进行分组,所以我只为每个作者撰写一个最新帖子。 这样可以正确地对输出进行分组,因此每个作者只能得到一篇帖子,但是在对结果进行分组之后而不是在选择之前对结果进行排序。 问题答案: 编辑: 经过一番评论后,我决定添加一些其他信息。 我工作的公司也使用Postgres,尤其是SQL Server。该数据库不允许此类查询。因此,我知道还有另一种方法(我在

  • Hadoop MapReduce的默认行为是在分区内对schffle键进行排序,但不是跨分区(它是使键跨部分排序的总排序) 我想问如何使用Spark RDD实现同样的事情(分区内排序,但不跨分区排序) < li>RDD的< code>sortByKey方法是进行总排序 < li>RDD的< code > repartitionandsorttwithinpartitions 在分区内进行排序,而不

  • 问题内容: 好的,因此在根据输入数据进行拓扑排序时,通常存在多个正确的解决方案,可以根据这些正确的解决方案对图进行“处理”,以便所有依赖项都位于“依赖”它们的节点之前。但是,我正在寻找稍微不同的答案: 假设以下数据: 和(必须先于并且必须先于)。 只有这两个限制,我们有多种候选方案:( ,, 等)。但是,我正在寻找一种将这些节点“分组”的方法,以便在处理完一组后,下一组中的所有条目都将处理其依赖项

  • 问题内容: 我有以下查询: 该查询的目标是从route_table(由routeid,observation_time,lat和lon列组成)中提取所有lon / lat值,按routeid对其进行分组,并在每个组中按观察时间对它们进行排序。但是,上面的SQL无效,因为observation_time出现在ORDER BY子句中,而不出现在GROUP BY中。当我将observation_time

  • 我有一个多维numpy数组,其中包含代表一个框的四个点(坐标): [开始X,开始Y],[结束X,开始Y],[结尾X,结束Y],[开始X,结束Y] 一个例子: 因为每个框都代表一个单词在图像中的位置,所以我想按照阅读的方式对这些框进行排序。从左上角开始,到右下角结束。我正在考虑按框的起始值排序: 这很好。现在,我必须将每个高度上与另一个重叠的框分组为一行。我用以下方法进行检查: 将分组框放在一行上,