微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MS Access SQL 计算 dBµV 的对数平均值

如何解决MS Access SQL 计算 dBµV 的对数平均值

不幸的是,我的 sql 技能非常基础。我希望有一个人可以帮助我。我想计算几个 dBµV 值的对数平均值。不幸的是,我无法使用标准平均函数,因为结果不正确。

今天我有 Excel 中的数据,我的计算工作正常。不幸的是,Excel 现在已达到其性能极限,因此我已将数据导入 MS Access(我使用的是 MS Access Ver Office 365)。

我有一个包含 ID、频率和 dBµV 值的表格。我想获得特定 ID 特定频率范围内所有 dBµV 样本的对数平均值。频率从 122 开始,最高可达 1802。并非每个 ID 都有一个适用于所有频率的值。

频率范围可以如下并且永远不会改变(意味着频率范围的开始和结束是恒定的):

  • 122 到 170
  • 178 到 226
  • 234 到 530
  • 等等

在 Excel 中,我使用以下公式计算频率范围 F122_170(B1:H1 包含 dBµV 值):

{=10*LOG(SUM(10^(B1:H1/10))/COUNTA(B1:H1))}

现在我完全迷失了获得所需结果的 sql 语句。

下面是我的表“tblDev”的一个例子。

ID 频率 dBuV
3977739907 122 32.44
3977739907 130 32.24
3977739907 138 31.93
3977739907 146 30.79
3977739907 154 31.31
3977739907 162 32.39
3977739907 170 32.43
3977739907 178 32.81
3977739907 186 32.21
3977739907 194 31.23

我想要的输出如下:

ID F122_170 F178_226 F234_530 F770_up
3977739907 31.97 31.23 37.03 0.00
3845056609 32.24 23.40 41.09 38.18
3882949203 23.10 16.98 31.03 32.26
... ... ... ... ...

如果有人能帮我写 sql 语句就好了。

问候帕特里克

解决方法

考虑:

Query1: Log() 返回自然对数(以 e 为底),所以要得到以 10 为底的对数,将 Log(x) 除以 Log(10)

SELECT tblDev.ID,10*(Log(Avg(10^([dBuV]/10)))/Log(10)) AS dB,Switch([freq]<=170,"F122_170",[freq]<=226,"F178_226",[freq]<=530,"F234_530",True,"F770_up") AS Grp
FROM tblDev
GROUP BY tblDev.ID,"F770_up");

Query2:对query1的结果进行透视

TRANSFORM First(dB)
SELECT Query1.ID
FROM Query1
GROUP BY Query1.ID
PIVOT Query1.Grp IN (F122_170,F178_226,F234_530,F770_up);
,

嗯。 . .我认为你可以使用:

select id,10 * log(avg(iif(freq between 122 and 170,10^dBuV),null)) / log(10)
       10 * log(avg(iif(freq between 178 and 256,null)) / log(10)
from t
group by id;

注意:这会将 SUM()/COUNT() 替换为 AVG() 。 . .我认为这是同一件事。

,

首先你需要一个 Log10 函数:

Public Function Log10( _
    ByVal Value As Double) _
    As Double

' Returns Log 10 of Value.
' 2015-08-17. Gustav Brock,Cactus Data ApS,CPH.

    Const Base10    As Double = 10

    ' No error handling as this should be handled
    ' outside this function.
    '
    ' Example:
    '
    '     If MyValue > 0 then
    '         LogMyValue = Log10(MyValue)
    '     Else
    '         ' Do something else ...
    '     End If
    
    Log10 = Log(Value) / Log(Base10)

End Function

然后你可以运行这个查询:

Select 
    ID,Sum(AF122_170) As F122_170,Sum(AF178_226) As F178_226,Sum(AF234_530) As F234_530,Sum(AF770_up) As F770_up
From

    (Select 
        tblDev.ID,IIf(freq Between 122 And 170,Log10(Avg(10 ^ (tblDev.dBuV / 10))) * 10,0) As AF122_170,IIf(freq Between 178 And 226,0) As AF178_226,IIf(freq Between 234 And 530,0) As AF234_530,IIf(freq >= 770,0) As AF770_up    From 
        tblDev
    Group By 
        ID,freq Between 122 And 170,freq Between 178 And 226,freq Between 234 And 530,freq >= 770) As T

Group By ID

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。