问题标签 [distinct-on]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
185 浏览

postgresql - PostgreSQL:DISTINCT 中的最新行的性能低于 GROUP BY 中的最大行

我有一种情况,我想更好地理解:

我有一个t有两行和一个索引的表:

为了获得created每个 distinct 的最新(最高值)行refid,我编写了两个查询:

t有大约 16M 行并且方差refid约为 500 个不同的值时,第二个查询的返回速度比第二个查询快得多。

起初我认为因为我是按它排序的,created DESC所以它需要进行反向索引扫描,并且从具有高方差(创建)的值开始。所以我添加了以下索引:

确实使用了它(而不是对前一个索引进行反向扫描),但没有任何改进。

如果我理解正确,第二个查询将聚合refid,然后扫描每个聚合以找到最大值created。听起来工作量很大。据我所知,第一个查询应该简单地迭代索引的第一部分,然后对于每个查询refid,它应该使用索引的第二部分,取第一个值。

显然情况并非如此,SELECT DISTINCT查询所需的时间是GROUP BY.

我在这里想念什么?

以下是EXPLAIN ANALYZE第一个和第二个查询的输出:

第一个查询运行大约 10 秒,而第二个查询在 2 秒内达到相同的结果!甚至不使用索引!

我正在使用 PostgreSQL 10.5。

0 投票
3 回答
399 浏览

sql - 如何采用按单独列排序的 DISTINCT ON 子查询并使其快速?

(AKA - 查询和数据非常类似于问题“选择按某列排序而在另一列上不同的行”,我怎样才能让它快速运行)。11. Postgres

我有一个表格prediction(article_id, prediction_date, predicted_as, article_published_date)它代表分类器对一组文章的输出。

新文章经常被添加到单独的表中(由 FK 表示article_id),并且在我们调整分类器时添加新的预测。

样本数据:

创建表脚本:

我们经常希望查看每篇文章的最新分类。为此,我们使用:

它返回类似:

使用 上的索引(article_id, prediciton_date desc),此查询运行得非常快(~15ms)。这是解释计划:

到现在为止还挺好。

当我想按 article_published_field 对该结果进行排序时,就会出现问题。例如:

这可行,但查询需要大约 3-4 秒才能运行,这使得直接使用它来响应 Web 请求太慢了。

这是解释计划:

有什么方法可以让这个查询运行得更快,还是我必须求助于刷新物化视图或设置触发系统来快速获取这些数据?

以供参考:

  • prediction表有 770 万行
  • 表中有 1.7M distinct article_idsprediction
  • 有一个索引(article_id, prediciton_date desc)和一个索引article_published_date desc
  • VACUUM ANALYSE已运行
0 投票
1 回答
309 浏览

postgresql - DISTINCT ON (col) col_alias – 别名不起作用

我正在尝试运行此命令:

这给了我错误:

错误:列“测试”不存在

但根据以下教程,test应该是别名

来源

如何让 distinct 成为别名?

0 投票
1 回答
28 浏览

sql - 试图从每组中只得到一行

我对 DISTINCT ON 有疑问。我有五组不同的人,其中包括姓名和姓氏。我的目标是每组只有一个名字(第一个)。尝试使用 DISTINCT ON 时,出现错误。

我希望我的桌子看起来像

谢谢您的帮助

0 投票
2 回答
56 浏览

postgresql - PostgreSQL:分组然后过滤表,条件为不存在

在 PostgreSQL 中,我有一个抽象的表,如下所示:

我想在查询中将其转换为:

……这样:

  1. 输入表的行按 A 和 B 分组,并且
  2. 对于每个 A 和 B 对:

    • 如果输入表有任何行使得 A = C,则输出表有一行 (A, B, D),其中 D 来自 A = C 的同一行。

      例如,输入表有一行 (x, 0, x, 1),其中 A 和 C 都是 x。这意味着输出表有一行 (x, 0, 1),因为 D 为 1。 (x, 0, y, 0) 行(因为它也有 A = x 和 B = 0)被丢弃。

    • 否则,如果不存在这样的行,则输出表有一行(A,B,null)。

      例如,输入表有两行,其中 A = y 和 B = 0——它们是 (y, 0, z, 0) 和 (y, 0, x, 0)。在这两行中都没有 A = C。这意味着输出表有 (y, 0, null) 行。

我想不出任何方法来使用聚合函数窗口函数子查询来执行这种转换。

0 投票
0 回答
40 浏览

postgresql - DISTINCT ON 将在 PostgreSQL 中使用的索引

有2张桌子:

  • challenge
  • entry(每个挑战有很多条目)

要输入挑战,需要输入他们的电子邮件姓名(用于排行榜) - 没有注册/身份验证过程,因此emailleaderboard_name都记录在entry表格中的每个条目中:

使用这种方法,可以在一次质询中多次使用相同的电子邮件值。换句话说,可以创建具有相同电子邮件的多个条目。

现在,获取得分最高的不同电子邮件的查询非常简单:

在这里,我们不希望出现以下条目:

  • a) 被管理员删除 ( is_removed = false)
  • b) 得分为零 ( total_points > 0)

challenge_id = 1也是必不可少的,因为它通过其 ID 将条目限制为特定挑战。

date_created此外,如果有许多具有相同分数的电子邮件,则order by会为每封电子邮件选择最早的条目。这可确保每封电子邮件选择的条目始终相同。

当我尝试构建查询计划程序将使用的索引时,就会出现问题。

我尝试在以下位置创建索引:

  • 3列:email, total_points DESC, date_created
  • 5列:challenge_id, is_removed, email, total_points DESC, date_created

EXPLAIN不断返回entry表的 Seq Scan。


奖金问题 - 如何有效地只选择前 N 个条目total_points DESC, date_created ASC?最简单的方法是用另一个查询包装这个查询,但有没有更好的方法?

0 投票
1 回答
81 浏览

sql - DISTINCT ON 查找最小和最大时间

我尝试使用 DISTINCT ON 和 posrgresql 来实现以下目标:假设我有一个如下所示的表:

我的目标是创建一个每个 id 仅包含 1 行的表,其中显示最小时间价格和最大时间价格的列。看起来像这样的东西:

我尝试使用 DISTINCT ON (id) 但无法真正得到它。

希望得到一些帮助,谢谢!

0 投票
2 回答
63 浏览

sql - Running "distinct on" across all unique thresholds in a postgres table

I have a Postgres 11 table called sample_a that looks like this:

I would like to create a query that for each unique timestep, gets the most recent values across each category at or before that timestep, and aggregates these values by taking the sum of these values and dividing by the count of these values.

I believe I have the query to do this for a given timestep. For example, for time 3 I can run the following query:

and get 6.5. (This is because at time 3, the latest from category 1 is 9 and the latest from category 2 is 4. The count of the values are 2, and they sum up to 13, and 13 / 2 is 6.5.)

However, I would ideally like to run a query that will give me all the results for each unique time in the table. The output of this new query would look as follows:

This new query ideally would avoid adding another subselect clause if possible; an efficient query would be preferred. I could get these prior results by running the prior query inside my application for each timestep, but this doesn't seem efficient for a large sample_a.

What would this new query look like?

0 投票
3 回答
69 浏览

mysql - 内部联接返回重复记录

我编写此查询以从 3 个不同的表中检索数据。

在这里[我选择的所有列都来自第一个和第二个表],根据我的实际需要检索数据:

想要的,查询结果是

=======

但是,当我在第三个表中选择两列时,出现问题并且数据重复:

第二个查询结果是 54 重复行

出了什么问题,我应该搜索哪些主题来获得这个想法?最后,什么是最好的解决方案?

0 投票
1 回答
38 浏览

sql - 删除查询中的重复结果

可以帮助我解决这个重复问题,它为同一记录返回超过 1 个结果

我的查询:

我的查询结果,但返回 3 或 5 个具有不同历史的相同 id 我只想返回每张票的 1 个 id,并且只返回每个刻度的最后记录历史

想返回如下

我想返回如下所示,看到字段 ch_description 和 ch_history 只带最近的记录,并且只带上列出的每张票的最后一条,没有重复我想带这种方式可以帮助我。