除了我对有人会如何做到这一点感到好奇以外,没有其他问题的押韵或理由。
平台: 当我希望使用SQL标准解决方案时,我的主要精力是在 PostgreSQL 8.4+上 。(我知道9.0+具有一些数组排序功能。)
SELECT id, group, dt
FROM foo
ORDER BY id;
id | group | dt -------+-------+----------- 1 | foo | 2012-01-01 1 | bar | 2012-01-03 1 | baz | 2012-01-02 2 | foo | 2012-01-01 3 | bar | 2012-01-01 4 | bar | 2012-01-01 4 | baz | 2012-01-01
我知道以下查询是错误的,但结果与我想要的类似;绑定两个字段的方法(的排序也group
应排序dt
):
SELECT id, sort_array(array_agg(group)), array_agg(dt)
FROM foo
GROUP BY id;
id | group | dt -------+----------------+------------------------------------ 1 | {bar,baz,foo} | {2012-01-03,2012-01-02,2012-01-01} 2 | {foo} | {2012-01-01} 3 | {bar} | {2012-01-01} 4 | {bar,baz} | {2012-01-01,2012-01-01}
有没有简单的方法来绑定字段以进行排序,而无需使用子查询?也许建立一个数组的数组,然后嵌套?
我将您的列名更改为group
,grp
因为它group
是Postgres和每个SQL标准中的保留字,并且不应用作标识符。
我理解您的问题是这样的:
获取以相同的排序顺序排序的两个数组,以便相同的元素位置对应于两个数组中的同一行。
使用子查询 或 CTE 并在聚合之前对行进行排序。
SELECT id, array_agg(grp) AS grp, array_agg(dt) AS dt
FROM (
SELECT *
FROM tbl
ORDER BY id, grp, dt
) x
GROUP BY id;
这是 更快 ,而不是使用单独ORDER BY
的聚合函数的条款
array_agg()
一样@Mosty演示(并一直在那里,因为PostgreSQL的9.0)。Mosty还会以不同的方式解释您的问题,并使用适当的工具进行解释。
ORDER BY
在子查询中安全吗?手册:
聚合函数
array_agg
,json_agg
以及类似的用户定义的聚合函数,会根据输入值的顺序产生有意义的不同结果值。默认情况下未指定此顺序,但可以通过ORDER BY
在聚合调用中编写一个子句来控制它,如第4.2.7节所示。另外,通常也可以提供来自已排序子查询的输入值。例如:SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
请注意,如果外部查询级别包含其他处理(例如联接),则此方法可能会失败,因为这可能会导致子查询的输出在计算聚合之前重新排序。
是的,在此示例中是安全的。
如果您确实 需要 没有子查询 的解决方案,则可以:
SELECT id
, array_agg(grp ORDER BY grp)
, array_agg(dt ORDER BY grp, dt)
FROM tbl
GROUP BY id;
注意ORDER BY grp, dt
。dt
除了打领带,我还进行排序,并使排序顺序明确。不需要grp
,尽管。
使用窗口函数还有另一种完全不同的方法:
SELECT DISTINCT ON (id)
id
, array_agg(grp) OVER w AS grp
, array_agg(dt) OVER w AS dt
FROM tbl
WINDOW w AS (PARTITION BY id ORDER BY grp, dt
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
ORDER BY id;
请注意,使用DISTINCT ON (id)
而不是仅DISTINCT
产生相同的结果,但执行速度快一个数量级,因为我们不需要额外的排序。
我进行了一些测试,这几乎与其他两个解决方案一样快。不出所料,子查询版本仍然是最快的。测试一下EXPLAIN ANALYZE
,看看自己。
问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。
将oneArr 按照 twoArr 的顺序进行排序,而且两个数组可能一样长,也可能不一样长, twoArr 是基于oneArr选中的数据,oneArr 是接口返回的数据,
问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I
问题内容: 我有这样的数组 如何按return_fare asc和one_way_fare asc排序值? 我尝试了array_multisort()但最终却得到了混乱的数据。 Asort仅适用于一维数组,我需要按两个或多个值进行排序,我如何才能像SQL中那样实现此功能,按field1 asc,field2 asc排序? 问题答案: 是正确的函数,您必须以某种方式搞砸了: 如果您在PHP的手册页上
问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出
如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有