我有如下输入表
Phonenumber GMTSTSRTTIME GMTENDTIME
989876758 20170101 11:15:00 20170101 11:20:00
989876758 20170101 13:15:00 20170101 13:33:00
查找表为
Intra_ID Seg_id Phonenumber GMTSTARTTIME seq
1213 12131 989876758 20170101 11:09:00 1
1213 12132 989876758 20170101 11:09:00 2
1213 12133 989876758 20170101 11:09:00 3
1214 12141 989876758 20170101 13:09:00 1
1214 12142 989876758 20170101 13:09:00 2
1214 12143 989876758 20170101 13:09:00 3
我希望输出如下,max(seg_id)后跟intra_id、phonenumber、GMTSTSRTTIME、GMTENDTIME
Intra_ID Seg_id Phonenumber GMTSTSRTTIME GMTENDTIME
1213 12133 989876758 20170101 11:15:00 20170101 11:20:00
1214 12143 989876758 20170101 13:15:00 20170101 13:33:00
在这种情况下,电话号码在同一天以不同的计时到达,因此它成为一个独特的值。当我尝试与查找表联接时,它会给出如下的交叉联接值。
Intra_ID Seg_id Phonenumber GMTSTSRTTIME GMTENDTIME
1213 12131 989876758 20170101 11:15:00 20170101 11:20:00
1213 12131 989876758 20170101 13:15:00 20170101 13:33:00
1214 12141 989876758 20170101 11:15:00 20170101 11:20:00
1214 12141 989876758 20170101 13:15:00 20170101 13:33:00
这是错误的。
请帮帮我
提前感谢
最佳答案
查询实际上只是电话号码和行号上input
和lookup
之间的一个基本内部连接,按时间顺序排列在组中的每个电话号码中。问题是表中没有行号列,MySQL不支持任何ROW_NUMBER()
分析函数。因此,一个选项是使用会话变量模拟行号。
SET @row_number_1 = 0;
SET @row_number_2 = 0;
SET @Phonenumber_1 = NULL;
SET @Phonenumber_2 = NULL;
SELECT
t2.Intra_ID,
t2.Seg_id,
t1.Phonenumber,
t1.GMTSTSRTTIME,
t1.GMTENDTIME, t1.rn, t2.rn
FROM
(
SELECT
@row_number_1:=CASE WHEN @Phonenumber_1 = Phonenumber
THEN @row_number_1 + 1
ELSE 1
END AS rn,
@Phonenumber_1:=Phonenumber as Phonenumber,
GMTSTSRTTIME,
GMTENDTIME
FROM input
ORDER BY Phonenumber, GMTSTSRTTIME
) t1
INNER JOIN
(
SELECT
@row_number_2:=CASE WHEN @Phonenumber_2 = t.Phonenumber
THEN @row_number_2 + 1
ELSE 1
END AS rn,
@Phonenumber_2:=Phonenumber as Phonenumber,
t.Intra_ID,
t.Seg_id
FROM
(
SELECT t1.*
FROM lookup t1
INNER JOIN
(
SELECT Phonenumber, Intra_ID, MAX(GMTSTARTTIME) AS max_gmt
FROM lookup
GROUP BY Phonenumber, Intra_ID
) t2
ON t1.Phonenumber = t2.Phonenumber AND
t1.GMTSTARTTIME = t2.max_gmt
) t
ORDER BY t.Phonenumber, t.GMTSTARTTIME
) t2
ON t1.Phonenumber = t2.Phonenumber AND
t1.rn = t2.rn;
注意,这个答案是一个很好的例子,说明了如何在单个查询中跟踪多个模拟行号。在这种情况下,我们可以为每个行号使用单独的会话变量。
输出:
在这里演示
Rextester
关于mysql - 提取ID以及电话号码和gmtstarttime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43510629/