如何在t-sql中使用group by with union?我想按联合结果的第一列分组,我写了下面的sql但它不起作用。我只是不知道如何引用union结果的指定列(在本例中为1)。 非常感谢。

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
有帮助吗?

解决方案

  

GROUP BY 1

我从来不知道GROUP BY支持使用序数,只支持ORDER BY。无论哪种方式,只有MySQL支持GROUP BY不包括没有在它们上执行聚合函数的所有列。不建议使用普通法,因为如果它们基于SELECT的顺序 - 如果它发生变化,那么你的ORDER BY(或者如果支持则为GROUP BY)也是如此。

当您使用 UNION 时,无需对内容运行 GROUP BY - UNION确保删除重复项; UNION ALL 更快,因为它没有 - 在这种情况下你需要GROUP BY ......

您的查询只需要:

SELECT a.id,
       a.time
  FROM dbo.TABLE_A a
UNION
SELECT b.id,
       b.time
  FROM dbo.TABLE_B b

其他提示

您需要为子查询添加别名。因此,您的陈述应该是:

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id

识别列很简单:

SELECT  *
FROM    ( SELECT    id,
                    time
          FROM      dbo.a
          UNION
          SELECT    id,
                    time
          FROM      dbo.b
        )
GROUP BY id

但它并没有解决这个查询的主要问题:第一列分组时第二列值要做什么?由于(特别!)您使用 UNION 而不是 UNION ALL ,因此您在两个子表之间不会有完全重复的行工会,但你可能仍然有一个值的一个值的几个时间值,你没有提示你想做什么 - 最小,最大,平均,总和,或什么?!因此,SQL引擎应该给出一个错误(虽然某些例如mysql只是从几个中选择一个随机值,我相信sql-server比这更好)。

因此,例如,将第一行更改为 SELECT id,MAX(time)等等!

with UnionTable as  
(
    SELECT a.id, a.time FROM dbo.a
    UNION
    SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top