+----------+--------------+-------------------------+
| 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     |

这是我写的查询的结果。 有两个和两个以上的行具有相同的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     |

结果是;

+----------+--------------+
| ticketid |time diff(sec)|
+----------+--------------+
|  1387935 |      40      |
|  1387938 |      120     |
|  1387939 |      24      |

你能告诉我怎么做吗?

谢谢。

#1楼 票数: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;

我使用了ticketdate作为日期列的名称,因为date是一个列的可怕名称(它是一个数据类型名称),永远不应该使用; 它必须在许多情况下用双引号才能工作。

便携式方法可能是其他人发布的自我加入方式。 上面的窗口函数方法也可能适用于Oracle,但在MySQL中似乎没有。 据我所知,它不支持SQL:2003窗口函数。

如果您SET sql_mode = 'ANSI'并使用timestamp而不是timestamp with time zonetimestamp with time zone则架构定义将与MySQL SET sql_mode = 'ANSI'使用。 似乎窗口功能不会; MySQL在OVER子句上扼杀。 看到这个SQLFiddle

#2楼 票数:2

试试这个查询 -

INSERT INTO ticket_post(ticketid, ticketpostid, date) VALUES
(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');

SELECT
  ticketid,
  TIME_TO_SEC(TIMEDIFF((
    SELECT t.date FROM ticket_post t WHERE t.ticketid = t1.ticketid AND t.date > t1.date ORDER BY t.date LIMIT 1),
    MIN(date)
  )) diff FROM ticket_post t1
GROUP BY ticketid;

+----------+------+
| ticketid | diff |
+----------+------+
|  1387935 |   40 |
|  1387938 |  120 |
|  1387939 |   24 |
+----------+------+

#3楼 票数:1

select 
  ticketid
  ,time_to_sec(timediff(t2.date, t1.date))  as timediff
from table t1
join table t2 on t1.ticketid=t2.ticketid and t1.ticketpostid<t2.ticketpostid

  ask by TraviJuu translate from so

未解决问题?本站智能推荐:

3回复

在表格的两行之间插入一行

我有一个表,其中的两列subj-id,subj-name采用以下格式。 现在,我需要在所有出现的位置之间在“数学与科学”之间插入“物理”行,表格应如下图所示 我长期以来一直有这个问题。 我在这里只提到了三个插入。 在实际问题中,我需要在50多个地方进行数学和科学之间的插入。
1回复

SELECT COUNT(*)和SELECT true在十亿行表中查找特定行之间的区别

我有一张表,可能有35亿个行。 我需要检查该表中是否有特定值,这是最快的方法? 与 使用适当的列索引获得“最快”结果的最佳方法是哪种?
3回复

两个连续日期之间的差异,存储在单独的行中

我表格的每一行都包含一个参考和一个日期。 我试图找到一个日期和上一个日期之间的天数。 让我们继续下面的示例: 我正在尝试获得类似的东西: 一次选择。 可能吗? 我正在使用SQL Server 2008。
2回复

PL/SQL、MySQL 或 PostgreSQL 中日期字段中日期之间的天数 [关闭]

关闭。 这个问题需要细节或清晰。 它目前不接受答案。 想改
2回复

使用“JOIN”和“WHERE”有什么区别?

我有两个 SQL 查询,一个是 WHERE,一个是 JOIN。 这两个查询有什么不同吗? 如果它们相同,使用哪个更有效?
4回复

行和列不同的两个日期之间的区别?

我的表架构如下所示。 有两种停止类型PK(提货)或DL(交付) 如果停止类型为PK,则出发日期存在;如果停止类型为DL,则交货日期存在。 对于每个出发和交付对,负载ID均相同。 对我来说,使它们复杂的是,它们并不总是排成一排。 我应该使用什么查询?
3回复

在mysql数据库中查找行和时间戳之间的交叉点

我有一个表,列出了某些对象的事件。 有两个事件:“运动”和“负载”。 它们可以开始和结束,并且这些事件在发生时列出时间戳。 现在我要计算以下三个数字: 运动发生的时间总和(小提琴的价值:700) 负载发生时的时间总和(小提琴中的值:630) 移动和载荷发生
2回复

SQL:将两个结果行合并为一个[重复]

这个问题已经在这里有了答案: MySQL查询在两列的基础上将行动态转换为列 1个答案 在数据库中 每个测试内容元素都有许多测试内容元素属性值 每个内容元素类型属性都有许多测试内容元素属性值 这个查询 呈现此结果: 但是我更愿