2016-11-14 74 views
1

我运行了以下查询以获取表的第一行和最后一行。查询获取表中的第一行和最后一行

SELECT Start, End, Start1, End1 
FROM 
(SELECT Start AS Start, End AS End 
    FROM [TB1] WHERE Id = 251 ORDER BY DateTime DESC LIMIT 1), 
(SELECT Start1 AS Start1, End1 AS End1 
    FROM [TB2] WHERE Id = 251 ORDER BY DateTime LIMIT 1); 

我得到的输出如下:

Start  End  Start1  End1 
25.32  -98.55 null  null 
null  null  29.81  -98.32 

我试图让在下面的格式输出:

Start  End  Start1  End1 
25.32  -98.55 29.81  -98.32 

回答

1

我觉得你的问题是“部分”,接下来将是如何为所有ID做同样的事情!见下面

SELECT Id, Start, End, Start1, End1 
FROM 
(SELECT Id, Start, End 
FROM (
    SELECT 
    Id, Start AS Start, End AS END, 
    ROW_NUMBER() OVER(PARTITION BY Id ORDER BY DateTime DESC) AS win 
    FROM [TB1]) 
WHERE win = 1 
) AS t1 
JOIN 
(SELECT Id, Start1, End1 
FROM (
    SELECT 
    Id, Start1 AS Start1, End1 AS End1, 
    ROW_NUMBER() OVER(PARTITION BY Id ORDER BY DateTime) AS win 
    FROM [TB2]) 
WHERE win = 1 
) AS t2 
ON t1.Id = t2.Id 
1

使用max这样的结果将是在一行。

SELECT max(Start) start, max(End) end, max(Start1) start1, max(End1) end1 
FROM 
(SELECT Start AS Start, End AS End 
    FROM [TB1] WHERE Id = 251 ORDER BY DateTime DESC LIMIT 1), 
(SELECT Start1 AS Start1, End1 AS End1 
    FROM [TB2] WHERE Id = 251 ORDER BY DateTime LIMIT 1); 
1

如果你想在一个表(而不是两个)的第一行和最后一行,则可以在standard SQL使用ARRAY_AGGORDER BYLIMIT(取消选中“使用传统的SQL”下的“显示选项计算它“在UI中)。

WITH T AS (
    SELECT 251 AS Id, 10.0 AS Start, -15 AS `End`, DATE('2016-11-09') AS DateTime UNION ALL 
    SELECT 251, 25.32 AS Start, -98.55, DATE('2016-11-10') UNION ALL 
    SELECT 251, 29.81, -98.32, DATE('2016-01-01') 
) 
SELECT 
    ARRAY_AGG(STRUCT(Start, `End`) 
      ORDER BY DateTime DESC LIMIT 1)[OFFSET(0)] AS first_row, 
    ARRAY_AGG(STRUCT(Start AS Start1, `End` AS End1) 
      ORDER BY DateTime ASC LIMIT 1)[OFFSET(0)] AS last_row 
FROM T 
WHERE Id = 251; 

通常,这可能会比使用分析函数快一点,但我没有做任何特定的比较。

相关问题