如何从以下模式中提取 SQL 计数?

Posted

技术标签:

【中文标题】如何从以下模式中提取 SQL 计数?【英文标题】:How would I extract a SQL count from the following schema? 【发布时间】:2012-03-24 07:21:30 【问题描述】:

假设我有一个表 MEETING 如下

M_DATE
M_RACE_NO
M_VENUE
M_ATHLETE

主键是日期、比赛编号、场地、运动员。每个日期/比赛编号/场地可以包含许多可能的运动员。假设对于特定的运动员,我希望提取日期、比赛编号、场地以及在该特定日期/比赛编号/场地参加比赛的运动员总数

例如假设运动员 Bolt 参加了两项比赛,总场数为 7 和 9,我想要类似以下的内容

2011-10-03, 4, NY, 7
2010-24-02, 5, SY, 9

我知道它看起来像

SELECT M_DATE, M_RACE_NO, M_VENUE, SUM(...) FROM MEETING WHERE M_ATHLETE='Bolt'

我不确定 SUM 之后会发生什么

【问题讨论】:

什么 RDBMS (Oracle / mysql / ...)?它是否支持窗口函数 - 即count(...) over (...) 【参考方案1】:

如果您的 RDBMS 支持:

SELECT M_DATE, M_RACE_NO, M_VENUE,
   COUNT(*) OVER (PARTITION BY M_DATE, M_RACE_NO, M_VENUE)
FROM MEETING
WHERE M_ATHLETE='Bolt'

如果没有:

select m1.m_date, m1.m_race_no, m1.m_venue, m2.count_races
from meeting m1
join (select m_date, m_race_no, m_venue, count(*) count_races
      from meeting group by m_date, m_race_no, m_venue) m2
  on m1.m_date = m2.m_date
  and m1.m_race_no = m2.m_race_no
  and m1.m_venue = m2.m_venue
where m1.m_athlete = 'Bolt'

【讨论】:

group by 和 join 应该是:GROUP BY m_date, m_race_no, m_venue @ypercube 我错过了所有列的主键,我会更新我的答案:)【参考方案2】:
SELECT 
    m.m_date
  , m.m_race_no
  , m.m_venue
  , COUNT(*) AS cnt 
FROM 
        meeting AS m
    JOIN
        meeting AS m2
            ON  m2.m_date    = m.m_date
            AND m2.m_race_no = m.m_race_no
            AND m2.m_venue   = m.m_venue
WHERE 
    m.m_athlete = 'Bolt'
GROUP BY
    m.m_date
  , m.m_race_no
  , m.m_venue

【讨论】:

以上是关于如何从以下模式中提取 SQL 计数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL 查询中的 CREATE/UPDATE/INSERT 语句中提取表名?

如何从pyspark中的文件中匹配/提取多行模式

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

如何从数组列表中提取项目并对其进行计数,以便从元素及其总计数(正确)在 Java 中创建映射?

如何从网站中提取数据计数器以在另一个 HTML 项目中用作 JS 变量

PL/SQL: INSTR(), SUBSTR(), 如何从多选列表中提取值