我有如下输入表

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

这是错误的。
请帮帮我
提前感谢

最佳答案

查询实际上只是电话号码和行号上inputlookup之间的一个基本内部连接,按时间顺序排列在组中的每个电话号码中。问题是表中没有行号列,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;

注意,这个答案是一个很好的例子,说明了如何在单个查询中跟踪多个模拟行号。在这种情况下,我们可以为每个行号使用单独的会话变量。
输出:
mysql - 提取ID以及电话号码和gmtstarttime-LMLPHP
在这里演示
Rextester

关于mysql - 提取ID以及电话号码和gmtstarttime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43510629/

10-12 22:07