Tra*_*Juu 7 mysql sql postgresql
+----------+--------------+-------------------------+
| ticketid | ticketpostid | date |
+----------+--------------+-------------------------+
| 1387935 | 3147808 | 2012-09-17 13:33:01 |
| 1387935 | 3147812 | 2012-09-17 13:33:41 |
| 1387938 | 3147818 | 2012-09-17 13:35:01 |
| 1387938 | 3148068 | 2012-09-17 13:37:01 |
| 1387938 | 3148323 | 2012-09-17 14:47:01 |
| 1387939 | 3147820 | 2012-09-17 13:36:01 |
| 1387939 | 3147834 | 2012-09-17 13:36:25 |
| 1387939 | 3147851 | 2012-09-17 13:41:01 |
| 1387939 | 3147968 | 2012-09-17 13:59:06 |
| 1387939 | 3147996 | 2012-09-17 14:03:01 |
Run Code Online (Sandbox Code Playgroud)
这是我写的查询的结果.有两个和两个以上的行具有相同的ticketid.我需要找到每个ticketid中前两个日期之间的时差
防爆.
+----------+--------------+-------------------------+
| ticketid | ticketpostid | date |
+----------+--------------+-------------------------+
| 1387935 | 3147808 | 2012-09-17 13:33:01 |
| 1387935 | 3147812 | 2012-09-17 13:33:41 |
| 1387938 | 3147818 | 2012-09-17 13:35:01 |
| 1387938 | 3148068 | 2012-09-17 13:37:01 |
| 1387939 | 3147820 | 2012-09-17 13:36:01 |
| 1387939 | 3147834 | 2012-09-17 13:36:25 |
Run Code Online (Sandbox Code Playgroud)
结果是;
+----------+--------------+
| ticketid |time diff(sec)|
+----------+--------------+
| 1387935 | 40 |
| 1387938 | 120 |
| 1387939 | 24 |
Run Code Online (Sandbox Code Playgroud)
你能告诉我怎么做吗?
谢谢.
Cra*_*ger 14
对于PostgreSQL,我认为你希望lag窗口函数比较行; 它比自连接和过滤器更有效.这不适用于MySQL,因为它似乎仍然不支持标准的SQL:2003窗口函数; 见下文.
要仅查找最低的两个,可以使用dense_rank窗口函数ticketid,然后过滤结果以仅返回行dense_rank() = 2,即具有从最低时间戳开始lag()的行,其中将生成具有最低时间戳的行.
请参阅此SQLFiddle ,其中显示了示例DDL和输出.
SELECT ticketid, extract(epoch from tdiff) FROM (
SELECT
ticketid,
ticketdate - lag(ticketdate) OVER (PARTITION BY ticketid ORDER BY ticketdate) AS tdiff,
dense_rank() OVER (PARTITION BY ticketid ORDER BY ticketdate) AS rank
FROM Table1
ORDER BY ticketid) x
WHERE rank = 2;
Run Code Online (Sandbox Code Playgroud)
我用作ticketdate日期列的名称,因为列date是一个可怕的名称(它是一个数据类型名称),永远不应该使用; 它必须在许多情况下用双引号才能工作.
便携式方法可能是其他人发布的自我加入方式.上面的窗口函数方法也可能适用于Oracle,但在MySQL中似乎没有.据我所知,它不支持SQL:2003窗口函数.
如果你SET sql_mode = 'ANSI'使用timestamp而不是使用,那么模式定义将适用于MySQL timestamp with time zone.似乎窗口功能不会; MySQL对该OVER条款进行了扼杀.看到这个SQLFiddle.
| 归档时间: |
|
| 查看次数: |
7183 次 |
| 最近记录: |