在如何为这种情况构造我的sql时遇到麻烦。
我有3张桌子:

人员表:

ID

--

A


FACT_1表:

Person_ID DAY metric

--------------------

A         1   x

A         2   y


FACT_2表:

Person_ID DAY metric

--------------------

A         3   a

A         2   b


我希望结果是:

Person_ID DAY metric1 metric2

-----------------------------

A         1   x       [null]

A         2   y       b

A         3   [null]  a


因此,这就像个人ID和日期分别与每个事实表的外部联接..但是当个人和日期相同时,我需要将两个指标捆绑在一起。
事实表可能很大,因此请记住这一点。

抱歉,格式化..不熟悉

最佳答案

除非从Person表中获取其他数据,否则此查询不需要它。如果需要,您可以将其加入UNION。

SELECT
   u.Person_ID
  ,u.DAY
  ,MAX(u.metric1) AS metric1
  ,MAX(u.metric2) AS metric2
FROM
(
  SELECT
     f1.Person_ID
    ,f1.DAY
    ,f1.metric AS metric1
    ,NULL AS metric2
  FROM
    Fact_1 AS f1
  UNION ALL
  SELECT
     f2.Person_ID
    ,f2.DAY
    ,NULL AS metric1
    ,f2.metric AS metric2
  FROM
    Fact_2 AS f2
) AS u
GROUP BY
   u.Person_ID
  ,u.DAY

Results:
+-----------+-----+---------+---------+
| Person_ID | DAY | metric1 | metric2 |
+-----------+-----+---------+---------+
| A         |   1 | x       | NULL    |
| A         |   2 | y       | b       |
| A         |   3 | NULL    | a       |
+-----------+-----+---------+---------+

关于mysql - MySQL中内部联接和外部联接的混合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51382133/

10-11 05:06