这似乎是重复的,但我找不到符合我要求的答案。引用了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


在这里,最后一个by返回唯一的行,但是所有tab1 cols都在重复,这是我不希望的,在这种情况下,记录仅在tab2.col1和tab2.col2上有所不同。现在的要求是,我希望tab1.col1,tab1.col2,tab1.col3是唯一的,并且对于来自tab2的那些列,分别只有一对分别的tab2.col1和tab2.col2。现在,我无法从第二个组中删除tab2.col1,tab2.col2并应用最小或最大聚合函数,因为在那种情况下,我将无法获取映射到特定记录的tab2.col2值的tab2.col1值。

注意:我正在使用Amazon Redshift作为数据库。子查询很重要,因为这实际上是3个表联接产生的复杂结果集,如果我直接将这3个表的联接与tab2一起使用,则查询将永远运行。为了简化此问题,假定子查询从table1返回col1,col2,col3。 Tab2和tab1是巨大的表:D ...子查询大大提高了性能(减少了20分钟到〜2分钟)。

最佳答案

如果您的要求低于以下结果,

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


然后您可以使用以下redshift 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的最小值和tab2.col4的最小值。如果需要最大值,则将顺序更改为DESC

希望这能解决您的问题。

您还可以检查我编写的结果集here

关于mysql - 如何基于多个唯一列选择数据,而不在结果集中的其余列上应用聚合函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40387146/

10-11 09:22