【问题标题】:Subquery group by DISTINCT column按 DISTINCT 列的子查询组
【发布时间】:2020-08-19 12:13:15
【问题描述】:

我有一个查询的简化版,如下所示:

SELECT
    count_last_8, goals_8, count_last_16, goals_16 
FROM (
    (
      SELECT
        COUNT(*) AS count_last_8,  f_total_ftg AS goals_8
      FROM (
        SELECT * 
        FROM results 
        ORDER BY f_datetime LIMIT 8 
      ) AS X 
    ) last_8g,
    (
      SELECT
        COUNT(*) AS count_last_16, f_total_ftg AS goals_16
      FROM (
        SELECT * 
        FROM results 
        ORDER BY f_datetime LIMIT 16 
      ) AS X 
    ) last_16g
);

results 表中还有 2 列 - f_player1f_player2,我想按 DISTINCT 玩家对查询进行分组

所以玩家名单是:

SELECT DISTINCT f_player1 AS player 
FROM results 
UNION 
SELECT DISTINCT f_player2 AS player 
FROM results;

如何添加此条件,以便每个表别名(last8glast16g)适用于这些不同的玩家?

当前查询的样本数据:

count_last_8    |   goals_8    | count_last_16   |  goals_16
    8                 4                16              4

我希望它如下所示:

  player  |   count_last_8    |   goals_8    | count_last_16   |  goals_16
    kray           2                 2                4              9
    peli           1                 3                3              7
    etc...

【问题讨论】:

  • 样本数据和期望的结果会很有帮助。
  • 好的,我已经添加了。谢谢
  • 提供初始样本数据,即您想要最终结果的数据。
  • 请同时提供表格说明。

标签: mysql sql postgresql subquery distinct


【解决方案1】:

这很难理解您的问题,使用真实的数据样本以及基于提供的样本的真实预期结果会容易得多。

但是,我尝试了一些方法,它可能是解决方案,也可能对您有所帮助:

SELECT 
  T1.player, 
  T1.count_last_8, 
  T1.goals_8, 
  T2.count_last_16, 
  T2.goals_16
FROM(
  SELECT 
    f_player1 AS player, 
    SUM(c1) AS count_last_8, 
    SUM(c2) AS goals_8
  FROM(
    SELECT 
      f_player1, 
      COUNT(f_player1) AS c1, 
      SUM(f_total_ftg) AS c2 
    FROM(
      SELECT * 
      FROM 
        results
      ORDER BY f_datetime
      LIMIT 8
    ) ST1
    GROUP BY f_player1
    UNION ALL
    SELECT 
      f_player2, 
      COUNT(f_player2) AS c1, 
      SUM(f_total_ftg) AS c2 
    FROM(
      SELECT * 
      FROM 
        results
      ORDER BY f_datetime
      LIMIT 8
    ) ST2
    GROUP BY f_player2 
  ) ST3
  GROUP BY f_player1
) T1
JOIN
(
  SELECT 
    f_player1 AS player, 
    SUM(c1) AS count_last_16, 
    SUM(c2) AS goals_16
  FROM(
    SELECT f_player1, 
    COUNT(f_player1) AS c1, 
    SUM(f_total_ftg) AS c2 
    FROM(
      SELECT * 
      FROM 
        results
      ORDER BY f_datetime
      LIMIT 16
    ) ST4
    GROUP BY f_player1
    UNION ALL
    SELECT 
      f_player2, 
      COUNT(f_player2) AS c1, 
      SUM(f_total_ftg) AS c2 
    FROM(
      SELECT * 
      FROM 
        results
      ORDER BY f_datetime
      LIMIT 16
    ) ST5
    GROUP BY f_player2
  ) ST6
  GROUP BY f_player1
) T2
ON T1.player = T2.player

SEE DEMO HERE

【讨论】:

  • 这几乎是正确的,但是当您应用限制时,它会分别从表中获取前 8 条和 16 条记录。相反,我需要它来搜索整个表并获得满足每列条件的前 8 个和 16 个
  • “满足每列条件的前 8 个和 16 个”是什么意思?哪些条件?
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
相关资源
最近更新 更多