【问题标题】:count max value by aggregate function通过聚合函数计算最大值
【发布时间】:2021-08-16 18:10:29
【问题描述】:

我想显示至少有一个指定驱动程序的计划数量,以便我可以计算出至少有 1 个驱动程序的保单的百分比。例如,可能有 2 个驱动程序,所以我只想看看那些至少有一个驱动程序的人。这是我开始的代码,我一直在思考如何让每个策略的计数显示为至少 1 个驱动程序。

    SELECT 
case when DRIVER_ROLE = 'Named driver' THEN 1 else null END as named_driver_ind
      ,DD.[DRIVER_ROLE]
      ,PD.[PLAN_NBR]
  FROM DD
  LEFT JOIN PD
  on PD.DRIVE_PLAN_NBR = DD.DRIVE_PLAN_NBR
group by 
DD.DRIVER_ROLE
,DD.[DRIVE_PLAN_NBR] 

这里有一些示例数据。前 3 行是一个包含 3 个驱动程序的策略。他们有 2 名司机,所以这需要算作是的,他们至少有 1 名司机

| DD.driver_role| DD.Drive_Plan_NBR|DP.PLAN_NBR   |DD.Driver_ID | 
|:------------: |:---------------: | :-----------:|:-----------:|
| Named driver  | 756              | 87397        | 123         |
| Policy holder | 756              | 87397        | 124         |
| Named driver  | 756              | 87397        | 125         |
| Policy holder | 759              | 23211        | 188         |

预期结果是计划 nbr 的计数和具有至少 1 个驱动程序的最大计数

| count_Plan_nbr| Policies with at least 1 more driver|| 
|:------------: |:------------------------------------:|
| 2             | 1                                    |   

【问题讨论】:

    标签: mysql group-by aggregate-functions


    【解决方案1】:

    欢迎来到 S/O。您真正需要的只是针对相关疾病的 DISTINCT 计划

    select distinct
          DD.DRIVE_PLAN_NBR
       from
          DD
       where
          DD.Driver_Role = 'Named driver'
    

    直接从您的 dd 表开始,该表具有您的条件“命名驱动程序”。由于 dd 也有计划号,所以只要得到不同的,无论有多少都将返回 ONE。不需要分组。

    现在,如果您真的需要替代“plan_nbr”与 ID,只需加入即可拉取。不需要任何左侧,因为主要查询将始终拉动那些具有命名驱动程序的人。你只是得到了额外的细节

    select distinct
          DD.DRIVE_PLAN_NBR,
          PD.Plan_Nbr
       from
          DD
             JOIN PD
                on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
       where
          DD.Driver_Role = 'Named driver'
    

    您提供的原始查询显示了我认为的所有额外部分,只是为了显示您正在测试的内容的上下文。但是,如果您的最终目标只是哪些计划至少有一个“指定司机”,那么现在您就拥有了。

    评论反馈

    好的,越来越近了。您需要多少不同的策略,以及不同驱动程序的实际数量。所以是的,这将使用聚合,但完成起来仍然相对简单。我将做一个两部分,你可以随意使用。第一个将显示每个计划以及有多少驱动程序

    select 
          DD.DRIVE_PLAN_NBR,
          PD.Plan_Nbr,
          count(distinct DD.Driver_ID) DriversOnThisPlan
       from
          DD
             JOIN PD
                on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
       where
          DD.Driver_Role = 'Named driver'
       group by
          DD.DRIVE_PLAN_NBR,
          PD.Plan_Nbr
    

    这将显示(根据您的数据),单行显示计划编号信息,但驱动程序的计数为 2。但此查询本身将显示每个计划以及每个计划有多少驱动程序。要获得所有这些返回的单行,请将其包装通过

    select 
          count(*) as NumberOfPlansWith1OrMoreDrivers,
          sum( PreQuery.DriversOnThisPlan ) as TotalDriversOnAllPlans
       from
          ( select
                  DD.DRIVE_PLAN_NBR,
                  PD.Plan_Nbr,
                  count(distinct DD.Driver_ID) DriversOnThisPlan
               from
                  DD
                     JOIN PD
                        on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
               where
                  DD.Driver_Role = 'Named driver'
               group by
                  DD.DRIVE_PLAN_NBR,
                  PD.Plan_Nbr ) PreQuery
    

    所以在这里,count(*) 只是基于内部有多少独特的计划,而 sum() 是所有符合条件的计划的总驱动因素。

    现在,需要注意的是,如果一位司机可能参与多个计划,则他们将被计入每个独特的计划,这可能会夸大实际的独特司机。例如,我作为私人承包商工作。我是一个人,但我工作的 5 家公司和你有一个政策。所以我是每家公司的承保司机。即使我是一个人,我也会出现在 5 份保单、5 名司机上。只是想解释/澄清您可能会被问到的一种可能性,但我认为这种情况对于正常的管理问题来说是一个真正的延伸异常情况。

    【讨论】:

    • 嗨@drapp 谢谢!我不确定这会奏效。计划编号显示该策略,并且该策略下可以有不同的驱动程序 ID。也许我想太多了!
    • @user16060159,然后编辑您现有的帖子,而不是通过评论。在底部添加显示一些样本数据的内容,而不是真实的保单编号或名称。显示两个表中的正确上下文。然后展示你想要的作为你的最终答案。显示足够的样本数据,以了解单个政策/计划/其他方面的多个驱动因素。这是让自己和他人给出更准确和完整答案的最佳方式。完成后,请回复我您所做的更改,我会再看一遍。
    • 我添加了更多细节
    • @user16060159,修改后的答案。
    • @user16060159,如果您有一个有助于或提供良好输入的答案,通常单击答案上的向上箭头。如果它解决了您的问题,请使用答案旁边的复选框,以便其他人知道什么有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2015-10-29
    • 2012-12-17
    • 1970-01-01
    • 2021-02-11
    • 2023-03-20
    相关资源
    最近更新 更多