2016-12-07 5 views
0

У меня проблема с запросом в SQL. Мой запрос что-то вроде этого:Как я могу получить всю строку с максимальным значением в столбце запроса с вложенным select?

SELECT t.id, t.attribute, t.name, t.date 
FROM (
SELECT * 
FROM table1 
WHERE ... 
UNION 
SELECT * 
FROM table2 
WHERE 
UNION 
...) t 
WHERE ... 
GROUP BY t.attribute 

То, что я хочу, чтобы извлечь все строки с последней датой для каждого атрибута (дата может быть пустым, а затем это последнее). Я знаю, что могу создать временную таблицу, но я хочу избежать ее, если это возможно. Я также хочу, чтобы не было гнездо снова одного и того же запроса FROM ни в WHERE, ни в JOIN. Есть ли какой-нибудь способ?

Спасибо!

+0

Вы можете предоставить таблицы 1 и 2 таблицы для работайте с. – monikapatel

+0

Я не понимаю, вы ссылаетесь на данные? если вы хотите использовать столбцы, вы можете предположить, что они одинаковы в таблице1, таблице2 и t – alexrn

+0

yup, просто отредактируйте свой вопрос с данными @alexrn – monikapatel

ответ

0

это один из способов сделать это с помощью CTE (Common табличных выражений):

;WITH Maxtable1 
    AS (SELECT attribute 
      , name 
      , MAX(t.date) AS MaxDate 
     FROM table1 
     GROUP BY attribute 
      , name), 
    Maxtable2 
    AS (SELECT attribute 
      , name 
      , MAX(t.date) AS MaxDate 
     FROM table2 
     GROUP BY attribute 
      , name), 
      . 
      . 
      . 
    Maxtable<n> 
    AS (SELECT attribute 
      , name 
      , MAX(t.date) AS MaxDate 
     FROM table<n> 
     GROUP BY attribute 
      , name), 
    DetailTable1 
    AS (SELECT id 
      , attribute 
      , name 
      , date 
     FROM table1 
      INNER JOIN Maxtable1 ON table1.attribute = Maxtable1.attribute 
           AND table1.name = Maxtable1.name 
           AND table1.date = Maxtable1.date), 
    DetailTable2 
    AS (SELECT id 
      , attribute 
      , name 
      , date 
     FROM table2 
      INNER JOIN Maxtable2 ON table2.attribute = Maxtable2.attribute 
           AND table2.name = Maxtable2.name 
           AND table2.date = Maxtable2.date), 
      . 
      . 
      . 
    DetailTable<n> 
    AS (SELECT id 
      , attribute 
      , name 
      , date 
     FROM table<n> 
      INNER JOIN Maxtable<n> ON table<n>.attribute = Maxtable<n>.attribute 
           AND table<n>.name = Maxtable<n>.name 
           AND table<n>.date = Maxtable<n>.date) 
    SELECT * 
    FROM DetailTable1 
    UNION 
    SELECT * 
    FROM DetailTable2 
    UNION 
    . 
    . 
    . 
    SELECT * 
    FROM DetailTable<n>; 
0

С modern SQL вы можете использовать функцию окна:

SELECT t2.id, t2.attribute, t2.name, t2.date 
FROM (
    SELECT t1.id, t1.attribute, t1.name, t1.date, 
      row_number() over (partition by t1.attribute order by t1.date desc) as rn 
    FROM (
     SELECT * 
     FROM table1 
     WHERE ... 
     UNION 
     SELECT * 
     FROM table2 
     WHERE ... 
     UNION 
     ... 
    ) t1 
) t2 
where rn = 1; 

В качестве альтернативы использовать общее табличное выражение, чтобы избежать вложенные производные таблицы:

with data as (
    SELECT * 
    FROM table1 
    WHERE ... 
    UNION 
    SELECT * 
    FROM table2 
    WHERE ... 
    UNION 
), numbered as (
    SELECT id, attribute, name, date, 
     row_number() over (partition by t1.attribute order by t1.date desc) as rn 
    FROM data 
) 
SELECT id, attribute, name, date 
from numbered 
where rn = 1; 
Смежные вопросы