作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是我正在努力实现的一个例子:
表A:
| type | message | createdAt |
|:----------:|:---------:|:--------------------------:|
| create | awesome | 2017-07-21 11:20:35.147629 |
| create | hello | 2017-07-21 11:20:35.147629 |
| create | good | 2017-07-22 10:20:34.123331 |
| upload | nope | 2017-07-22 11:28:08.815828 |
| create | test | 2017-07-22 11:29:35.147629 |
| create | hello | 2017-07-22 12:20:35.147629 |
期望的输出:
| type | new_message | new_createdAt |
|:------:|:------------:|:--------------------------:|
| create | 3 | 2017-07-22 10:20:34.123331 |
| upload | nope | 2017-07-22 11:28:08.815828 |
| create | 2 | 2017-07-22 12:20:35.147629 |
只有在createdAt
序列中,SQL语句才应该组合相似的type
。如果序列中相似 type
值的数量大于 1,则 new_message
是计数,否则 new_message
与 message
(这个 if-else 子句不是最重要的功能,只给出计数的语句也可以)。
谢谢。
更新
是否可以在时间序列中添加另一个因素,仅当最低和最高 createdAt
之间的差异为 X 时才分组。
例如如果我选择 X=24 小时,表 A 的输出将更改为:
| type | new_message | new_createdAt |
|:------:|:------------:|:--------------------------:|
| create | 2 | 2017-07-21 11:20:35.147629 |
| create | good | 2017-07-22 10:20:34.123331 |
| upload | nope | 2017-07-22 11:28:08.815828 |
| create | 2 | 2017-07-22 12:20:35.147629 |
没有 JOIN
有没有办法做到这一点。
最佳答案
您可以使用 ROW_NUMBER
的差异:
WITH CteRn AS(
SELECT *,
ROW_NUMBER() OVER(ORDER BY createdAt)
- ROW_NUMBER() OVER(PARTITION BY type ORDER BY createdAt) AS rn
FROM Tbl
)
SELECT
type,
CASE
WHEN COUNT(*) > 1 THEN CAST(COUNT(*) AS VARCHAR(30))
ELSE MAX(cte.message)
END AS message,
MAX(cte.createdAt) AS createdAt
FROM CteRn cte
GROUP BY cte.type, cte.rn
ORDER BY MAX(cte.createdAt);
关于SQL Group By 用于排序时间序列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45425383/
我是一名优秀的程序员,十分优秀!