【问题标题】:Query to get the first and last row in a table查询以获取表中的第一行和最后一行
【发布时间】:2016-11-15 01:00:55
【问题描述】:

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

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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用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);
      

      【讨论】:

        【解决方案3】:

        如果您想要单个表(而不是两个)上的第一行和最后一行,您可以使用 ARRAY_AGGORDER BYLIMITstandard SQL 中计算它(取消选中“使用旧版 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;
        

        总的来说,这也可能比使用解析函数快一点,但我没有做过任何具体的比较。

        【讨论】:

          猜你喜欢
          • 2017-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-21
          相关资源
          最近更新 更多