基于分子中特定条件的平均值

Posted

技术标签:

【中文标题】基于分子中特定条件的平均值【英文标题】:Average based on certain condition in the numerator 【发布时间】:2019-06-21 09:11:02 【问题描述】:

我有两个表 WIP 和 ROS,两个表都有很多列,但所需的主要列是 Branch、Date、LC 和 'DN' 和 'JCN' 用于连接两个表,输出应为以下格式 分支,日期,计数(*根据条件)/计数(*)

如前所述,两个表都有很多列,但对于我的查询:WIP 包含 Branch、Status、Date 和 DN 列,而 ROS 包含 Branch、LC 和 JCN 列

我使用了 case case 语句,如下所示:

select a.Branch,[Billed Date],avg(case when LC in 
('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
from WIP a join ROS b on a.DN = b.JCN
where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
group by a.Branch,[Billed Date]
order by 1,2

我正在尝试使用联接和相关子查询而不使用 case 语句来获得结果

我使用了下面的查询,但得到的结果不正确。

 select a.Branch,[Billed Date], 
            1.0*(select count(*) from ROS where LC in ('A22D','SB15','SB16','AT01','AT02','AT03') and c.Branch = 
 a.Branch )/(select count(*) from ROS d where d.Branch = a.Branch)
 from WIP a join ROS b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 order by 1,2

我期望输出是:

 Branch     Date      Average_Jobs
   A     2019-06-01       0.11
   B     2019-06-01       0.09
   C     2019-06-01       0.12
   A     2019-06-02       0.12
   B     2019-06-02       0.10
   C     2019-06-02       0.13

平均列是根据每个分支机构和每天的 A22D、SB15、SB16、AT01、AT02、AT03 等 LC 计数除以总 LC 计数得出的。

我的相关子查询低于输出,我知道平均数字都是错误的:

Branch  Date        Avg
A   2019-06-01  0.032258065
A   2019-06-02  0.032258065
A   2019-06-03  0.032258065
A   2019-06-04  0.032258065
A   2019-06-05  0.032258065
A   2019-06-06  0.032258065
B   2019-06-01  0.032183908
B   2019-06-02  0.032183908
B   2019-06-03  0.032183908
B   2019-06-04  0.032183908
B   2019-06-05  0.032183908
B   2019-06-06  0.032183908
C   2019-06-01  0.032183908
C   2019-06-02  0.032183908
C   2019-06-03  0.032183908
C   2019-06-04  0.032183908
C   2019-06-05  0.032183908
C   2019-06-06  0.032183908

*****编辑: 我需要修改查询,因为它在手动检查时没有给我正确的结果。问题是DN是主键,JCN是外键,在EX的LC列下有很多重复:

 WIP Table           ROS Table
    DN             JCN        LC
    11A            11A        A21X
    12A            11A        SB15
     .             11A        AT09
     .             11A        A22A 
     .             12A        A22A
     .             12A        AT11  
                   12A        SB01  

我的查询输出给出的平均值为 14.28%,因为在 7 行中,第二行中的“SB15”满足条件。而我需要平均为 50%。这是因为 DN 列下有两个条目:11A 和 12A,其中只有一个具有我们感兴趣的 LC,即“SB15”。因此平均值为 50% 的 1/2 = .5。我知道我需要取 JCN 或 DN 的 DISTINCT 值的比率才能得到正确的结果,我使用 DISTINCT 如下但没有得到正确的结果:

 select a.Branch,[Billed Date],avg(case when LC in 
 ('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
 from WIP a join (select distinct JCN,LC from ROS) b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 group by a.Branch,[Billed Date]
 order by 1,2    

有人可以告诉我如何获得吗?

【问题讨论】:

到底有什么不正确的?提供预期结果的样本数据 请表定义 你得到的结果不依赖于日期,因为你的子查询不依赖于它。要获得您想要的内容,请向它们添加 a.[Billed Date] 参数。如果ROS tble 没有与a.[Billed Date] 比较的日期列,则坚持CASE 版本 我尝试再添加一个条件,其中我也使用 DN 和 JCN 加入:但现在我得到“除以零错误”。错误,请告诉我为什么我需要使用“日期”列添加,是的,ROS 中没有日期列。 如果ROS 中没有日期列,则您的ROS-subquery 版本与问题无关,因为您希望获得与日期相关的结果。 case 版本有什么问题? 【参考方案1】:
SELECT
  all_fields.*
FROM
  (
    SELECT
      Branch,
      MAX(Date)
    FROM
       yourtable
    GROUP BY
      Branch
   ) AS max_recs
LEFT OUTER JOIN yourtable AS all_fields ON max_recs.id = all_fields.id

【讨论】:

以上是关于基于分子中特定条件的平均值的主要内容,如果未能解决你的问题,请参考以下文章

基于日期时间列名称的数据框的条件平均值

Python Pandas Dataframe - 基于条件的分组和平均值

熊猫数据框条件 .mean() 取决于特定列中的值

过去 30 天的平均值,不包括当前记录(混合日期和基于行的条件)

在R中有条件地计算特定数据范围的平均速度

如何根据条件删除结果以计算平均和特定电影