- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
免责声明:显示的问题比我最初预期的要普遍得多。下面的示例取自另一个问题的解决方案。但现在我正在使用这个示例来解决更多问题 - 主要与时间序列相关(查看右侧栏中的“链接”部分)。
所以我试图首先更一般地解释这个问题:
我正在使用 PostgreSQL,但我确信这个问题也存在于其他支持 DBMS(MS SQL Server、Oracle 等)的窗口函数中。
Window functions可用于通过公共(public)属性或值将某些值组合在一起。例如,您可以按日期对行进行分组。然后您可以计算每个日期内的最大值或平均值或计算行数或其他任何内容。
这可以通过定义PARTITION
来实现。按日期分组适用于 PARTITION BY date_column
。现在您想执行一项操作,该操作需要在您的组中进行特殊排序(计算行号或对列求和)。这可以通过 PARTITON BY date_column ORDER BY an_attribute_column
来完成。
现在考虑更精细的时间序列分辨率。如果你没有日期但有时间戳怎么办。那么你就不能再按时间列分组了。但尽管如此,按添加顺序分析数据可能很重要(时间戳可能是数据集的创建时间)。然后您意识到一些连续的行具有相同的值,并且您希望按这个公共(public)值对数据进行分组。但线索是这些行具有不同的时间戳。
这里的问题是您不能执行 PARTITION BY value_column
。因为 PARTITION BY
强制先排序。因此,您的表将在分组之前按 value_column
排序,不再按时间戳排序。这会产生您意想不到的结果。
更一般地说:问题是确保特殊排序,即使有序列不是创建分区的一部分。
示例:
我有下表:
ts val
100000 50
130100 30050
160100 60050
190200 100
220200 30100
250200 30100
300000 300
500000 100
550000 1000
600000 1000
650000 2000
700000 2000
720000 2000
750000 300
我遇到了一个问题,我必须将 val
列的所有相关值分组。但我想在 ts
之前保留顺序。为此,我想为每个 val
组添加一个具有唯一 ID 的列
预期结果:
ts val group
100000 50 1
130100 30050 2
160100 60050 3
190200 100 4
220200 30100 5 \ same group
250200 30100 5 /
300000 300 6
500000 100 7
550000 1000 8 \ same group
600000 1000 8 /
650000 2000 9 \
700000 2000 9 | same group
720000 2000 9 /
750000 300 10
第一次尝试 是使用 rank
窗口函数,它可以正常完成这项工作:
SELECT
*,
rank() OVER (PARTITION BY val ORDER BY ts)
FROM
test
但在这种情况下,这不起作用,因为 PARTITION BY
子句首先按其分区列(在本例中为 val
)然后按其 对表进行排序code>ORDER BY
列。所以顺序是 val, ts
而不是 ts
的预期顺序。所以结果当然不是预期的。
ts val rank
100000 50 1
190200 100 1
500000 100 2
300000 300 1
750000 300 2
550000 1000 1
600000 1000 2
650000 2000 1
700000 2000 2
720000 2000 3
130100 30050 1
220200 30100 1
250200 30100 2
160100 60050 1
问题是:如何通过 ts
获取与订单相关的组 ID?
编辑:我在下面添加了自己的解决方案,但我对此感到非常不舒服。这似乎太复杂了。 我想知道是否有更好的方法来实现这个结果。
最佳答案
我自己想出了这个解决方案(希望别人能得到更好的):
ts
排序lag
窗口函数 ( https://www.postgresql.org/docs/current/static/tutorial-window.html ) 给出下一个 val
值0
或 1
SUM
对这些值求和。这会生成我正在寻找的组。他们对 val
列进行分组,但确保按 ts
列排序。 查询:
SELECT
*,
SUM(is_diff) OVER (ORDER BY ts)
FROM (
SELECT
*,
CASE WHEN val = lag(val) over (order by ts) THEN 0 ELSE 1 END as is_diff
FROM test
)s
结果:
ts val is_diff sum
100000 50 1 1
130100 30050 1 2
160100 60050 1 3
190200 100 1 4
220200 30100 1 5 \ group
250200 30100 0 5 /
300000 300 1 6
500000 100 1 7
550000 1000 1 8 \ group
600000 1000 0 8 /
650000 2000 1 9 \
700000 2000 0 9 | group
720000 2000 0 9 /
750000 300 1 10
关于sql - 窗口函数 : PARTITION BY one column after ORDER BY another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319688/
我正在寻找通过 sql 查询对我的 sql 结果进行排序,大概在 order by 子句中使用某种嵌套的 order by/order by 我有以下数据: TERM USER I
我有一个表格,其中包含如下所示的部分数据。我已经在 edition_id 上完成了订购。现在还需要订购 laungauge_id,这取决于 edition_id 的值。 Edition_id 是指报纸
所以我有两个表,Questions 和 Answers,由多对多关系表 QuestionsAnswers 连接。 Questions 有一个排序列,允许我控制它们如何显示给用户,而 Questions
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
在具有多个 order by 子句的 SQL 查询中,它们是否真的在执行期间全部运行? 例子: select * from my_table order by field5, field3, fiel
我跟进 query其中 schema.org 数据库用于查找类的子级数量 - 作为比我的应用程序更简单的数据库。我想按字母顺序连接 child 的名字。查询: prefix schema: pre
正如 nazdrovje 所指出的(参见 here ) Ordering@Ordering 可用于获取列表中每个元素的排名。即使列表包含重复元素,结果也是 n 排列(作为整数 1 到 n 的有序列表,
我有两张 table 。 它们都有日期和 item_id 列。 我正在通过 item_id 加入他们。 结果应按两个日期列一起排序 下面的代码有效,生成正确的结果集... 但是它们仅按第一个表的日期排
尝试掌握 SQL 我想按日期订购,然后在其中按标题订购。 示例: SELECT * FROM tblboek ORDER BY jr_van_uitgave DESC 如何在按年龄的订单中按头衔排序?
我想使用 FIELD 参数对我的 SQL 输出进行排序,但是当我这样做时,它首先吐出我不想要的结果,然后它首先吐出我想要的结果。在结果之上,它首先吐出。如果这有意义的话 ;) 如何先吐出已定义的值,然
我有一个无法破解的排序问题。我这样从我的表中选择: SELECT * FROM 'sidemodules' WHERE name = 'module1' OR name = 'module2' OR
我对 Django oscar 的覆盖模型有疑问。我想为模型添加一个新字段,但是当我这样做时,我遇到了 RuntimeError: Conflicting 'order' models in appl
我有两个表,电影和类别,我想先按CategoryID获得一个排序列表,然后按名称排序。。电影表格有三个列ID、NAME和CategoryID。CATEGORY表有两列ID和NAME。。我尝试了下面这样
In a MySQL query, when using the DISTINCT option, does ORDER BY apply after the duplicates are re
我想创建一个 sql 查询,为 2 个不同的查询一起返回结果。例如,我想要以下形式的结果:产品名称, avg(price), min(price), max(price), avg(order), m
我正在使用行号从存储过程中获取分页结果。 我发现使用动态 case 语句列名称进行排序会减慢速度 - 但如果我对所有内容进行硬编码就可以了。 有没有办法通过不使整个 sql 查询一个字符串并使用 SP
如何在范围搜索中使用Morton Order? 在wiki中,在“使用一维数据结构进行范围搜索”段落中, 它说 "the range being queried (x = 2, ..., 3, y =
我正在使用 sequelize.js,我在使用 order 语句时遇到问题,我想先通过 if id 排序(如果我的 id 在该别名表中),然后再排序.... order = [['alias', 'i
我有一个 php 脚本,它从数据库中提取内容并以某种方式打印它们。数据库有一个名为“order”的列标题,它的 INT 大小为 11。当我从数据库中获取数据时,我试图按数据库中的值“order”对内容
我有一个带有 ORDER BY 子句的 UPDATE 查询。我已将相同的查询复制到具有相同 ORDER BY 子句的 SELECT 中,但得到了不同的结果。 更新查询: UPDATE t_locks
我是一名优秀的程序员,十分优秀!