0

Это может показаться дублирующимся, но я не смог найти ответ, соответствующий моим требованиям. Написал here, но его не совсем то же самое, и ответы на меня не касаются. Отсюда и вопрос.Как выбрать данные на основе нескольких уникальных столбцов без применения агрегатных функций в остальном столбце в наборе результатов

SELECT tab1.col1, tab1.col2, tab1.col3, tab2.col3, tab2.col4 
from 
    (SELECT col1, col2, col3 
     FROM table1 
     GROUP BY col1, col2, col3) AS tab1 
JOIN tab2 
    ON tab1.col1 = tab2.col1 
AND tab1.col2 = tab2.col2 
GROUP BY tab1.col1, tab1.col2, tab1.col3, tab2.col3, tab2.col4 

Пример данные:

Table1       Tab2    
col1 | col2 | col3   col1 | col2 | col3 | col4 
=======================   ============================= 
page1 image1 referer1  page1 image1 150  75 
page1 image1 referer1  page1 image1 120  85 
page2 image2 referer2  page2 image2 200  400 
page1 image1 referer1  page1 image1 750  1024 
page2 image2 referer2  page2 image2 450  575 
page1 image1 referer1  page1 image1 600  900 

Ожидаемый результат:

tab1.col1 | tab1.col2 | tab1.col3 | tab2.col3 | tab2.col4 
================================================================== 
    page1  image1  referer1  600   900 
    page2  image2  referer2  200   400 

Здесь последней группы по возвращениям уникальных строк, но все Tab1 смещ_по_столбцы повторяют, которые я надеваю» t, и в этом случае записи изменяются только на tab2.col1 и tab2.col2. Теперь требование состоит в том, чтобы я хотел, чтобы tab1.col1, tab1.col2, tab1.col3 были уникальными, и только пара соответствующих tab2.col1 и tab2.col2 для этих столбцов из tab2. Теперь я не могу удалить tab2.col1, tab2.col2 из второй группы и применить функцию min или max aggregate, потому что в этом случае я не получу значение tab2.col1, которое отображает значение tab2.col2 для конкретной записи ,

Примечание: Я использую Amazon Redshift как DB. Подзапрос важен, поскольку на самом деле это сложный набор результатов, созданный из 3 соединений таблицы, и если я использую объединение этих трех таблиц непосредственно с tab2, тогда запрос выполняется вечно. Для простоты этого вопроса предположим, что подзапрос возвращает col1, col2, col3 из таблицы1. Tab2 и tab1 являются ginormous tables: D ... подзапрос улучшает производительность значительно (сокращение 20mins до ~ 2mins).

+1

нет ничего сложного в вашем подзапрос. и сам запрос выглядит очень неясным. попробуйте установить sqlfiddle и объяснить свою цель с помощью некоторого набора данных и ожидаемого результата, который вам нужен. – Alex

+0

Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Подзапрос - это просто 'SELECT distinct col1, col2, col3' –

ответ

0

Если ниже результата ваше требование,

tab1.col1 | tab1.col2 | tab1.col3 | tab2.col3 | tab2.col4 
================================================================== 
    page1  image1  referer1  120   85 
    page2  image2  referer2  200   400 

, то вы можете достичь его, используя ниже красного смещения SQL запроса

SELECT tab1.col1, tab1.col2, tab1.col3, tab2.col3, tab2.col4 
FROM 
    (SELECT col1, col2, col3 
    FROM table1 
    GROUP BY col1, col2, col3) AS tab1 
JOIN 
    (SELECT col1, col2, col3, col4 
    FROM 
    (SELECT col1, col2, col3, col4, ROW_NUMBER() OVER(PARTITION BY col1, col2 ORDER BY col3 ASC, col4 ASC) row_num 
     FROM table2) tab2 
    WHERE row_num = 1) tab2 ON tab1.col1 = tab2.col1 
     AND tab1.col2 = tab2.col2 

Ключ в вышеуказанном заявлении SQL является «ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3 ASC, col4 ASC) ". Это даст вам минимальное значение tab2.col3 и min значение tab2.col4. Если вам нужно макс значение, а затем изменить порядок DESC

Надеется, что это должно решить ваш вопрос.

Вы также можете проверить результат набора here, который я написал

+0

Спасибо @ viki888. Это кажется правильным. – Roy

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