2016-11-14 4 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

Если вы хотите, первые и последние строки более одной таблицы (вместо двух), вы можете вычислить его с помощью ARRAY_AGG с ORDER BY и LIMIT в standard SQL (снимите флажок «Использовать Наследства SQL» в разделе «Показать параметры "в пользовательском интерфейсе).

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; 

В общем, это, вероятно, будет немного быстрее, чем при использовании аналитической функции, тоже, но я не сделал каких-либо конкретных сравнений.

Смежные вопросы