Mysql 需要编写一个查询而不是5个查询才能获得所有5个状态的结果

Mysql 需要编写一个查询而不是5个查询才能获得所有5个状态的结果,mysql,sql,database,groupwise-maximum,Mysql,Sql,Database,Groupwise Maximum,CSV文件大约有62000行,它有州和县(县名称在该特定州内是唯一的) 我不得不对视图写5个查询。每个查询将检索其中一个州的州名、日期、最大(SUMConfixed)以及每个州确诊病例数最多的日期 SELECT State_Name, Date, ConfirmedCases AS Max_ConfirmedCases FROM covid_by_state WHERE ConfirmedCases = (SELECT max(ConfirmedCases) AS Max_Confirm

CSV文件大约有62000行,它有州和县(县名称在该特定州内是唯一的)

我不得不对视图写5个查询。每个查询将检索其中一个州的州名、日期、最大(SUMConfixed)以及每个州确诊病例数最多的日期

SELECT State_Name, Date, ConfirmedCases AS Max_ConfirmedCases
FROM covid_by_state
WHERE ConfirmedCases =
    (SELECT max(ConfirmedCases) AS Max_ConfirmedCases
     FROM covid_by_state
     WHERE State_Name='Texas');
上面的查询为我提供了一个特定状态的结果,但我无法找到如何在一个查询中获得5个状态的结果。

我想您需要一个相关子查询:

SELECT cbs.State_Name, cbs.Date, cbs.ConfirmedCases as Max_ConfirmedCases
FROM covid_by_state cbs
WHERE cbs.ConfirmedCases = (SELECT max(cbs2.ConfirmedCases) 
                            FROM covid_by_state cbs2
                            WHERE cbs2.State_Name = cbs.State_Name
                           );
这将同时返回所有状态的行

编辑:

如果希望特定状态的所有日期都具有最大值,则可以使用聚合:

SELECT cbs.State_Name, GROUP_CONCAT(cbs.Date) as dates,
       cbs.ConfirmedCases as Max_ConfirmedCases
FROM covid_by_state cbs
WHERE cbs.ConfirmedCases = (SELECT max(cbs2.ConfirmedCases) 
                            FROM covid_by_state cbs2
                            WHERE cbs2.State_Name = cbs.State_Name
                           )
GROUP BY cbs.State_Name, cbs.ConfirmedCases

我正在跳过使用视图的过程;我认为它不会增加可读性方面的任何价值,如果您想开始将查询限制在某个日期范围或添加其他条件,那么它也不会起作用

select
    State_Name,
    max_confirmed_cases_date as Date,
    max(ConfirmedCases) as Max_ConfirmedCases
from (
    select
        State_Name,
        first_value(Date) over (partition by State_Name order by ConfirmedCases desc, Date) max_confirmed_cases_date, 
        ConfirmedCases
    from (
        select Date, State_Name, sum(Daily_Count_Cases) ConfirmedCases
        from Covid_By_County
        group by Date, State_Name
    ) daily_state_totals
) daily_state_totals_with_max_cases_date
group by State_Name, max_confirmed_cases_date
最里面的子选择相当于您的视图;它在每个州每个日期获得一行,总共包含案例。中间的子选择重复该状态的每一行,但不使用date,而是使用first_value()查找案例数最多的状态的日期(在案例中,优先选择较早的日期而不是较晚的日期)。然后,外部选择将其减少为每个状态一行

或者,如果您使用的是不支持窗口功能的旧版本:

select
    State_Name,
    date(substr(min(concat(99999999999-ConfirmedCases,Date)),12)) as Date,
    max(ConfirmedCases) as Max_ConfirmedCases
from (
    select Date, State_Name, sum(Daily_Count_Cases) ConfirmedCases
    from Covid_By_County
    group by Date, State_Name
) daily_state_totals
group by State_Name

此查询使用了一种技巧,通过获取编码案例和日期的字符串的最小值来获取每个州案例最多的日期。

这是我创建的视图,创建视图COVID\u by\u state作为选择日期,state\u Name,Sum(Daily\u Count\u cases)作为确认案例,Sum(Daily\u death)由_县集团按日期、州名称确定的每日死于新冠病毒的人数;STATE选项卡创建表STATE(STATE_Name VARCHAR(50)、STATE_Cap_City VARCHAR(50)、主键(STATE_Name));COUNTY表创建表country(country_Name VARCHAR(50),State_Name VARCHAR(50),外键(State_Name)引用State(State_Name),主键(country_Name,State_Name));我认为,如果两个州有相同的最大confirmedCase,那么这(以及提问者的原始答案)是不正确的。为了避免重复,请参阅mysql.rjweb.org/doc.php/groupwise中的一些解决方案_max@ysth . . . OP不清楚在这种情况下该怎么办。考虑到现有查询返回的任何状态的行数都与特定状态的最大值相匹配,这无疑是一种改进。