【问题标题】:How to correctly use AVG() in SQL?如何在 SQL 中正确使用 AVG()?
【发布时间】:2018-11-08 01:36:22
【问题描述】:

我通过将 SSI 值存储在此表中来跟踪 RF 网络中的基站性能:

TABLE BASE_SSI:
    wayside     BIGINT (PK)
    timestamp   datetime
    base        varchar(12)
    ssi         int

SSI 每小时读取一次,并与大约一年的读数一起存储在此表中。

我可以使用以下查询提取过去任何一天的 SSI 值:

select wayside,timestamp,base,ssi from BASE_SSI 
where wayside=225520220000 
and timestamp > DATEADD(day,-7,getdate())
and timestamp < DATEADD(day,-6,getdate())
order by timestamp desc

这给了我这些结果:

wayside         timestamp             base        ssi
225520220000    2018-11-02 00:21:09   423.3.01    33
225520220000    2018-11-01 22:31:03   423.3.01    32
225520220000    2018-11-01 20:40:53   423.3.01    32
225520220000    2018-11-01 18:50:45   423.3.01    31
225520220000    2018-11-01 17:00:35   423.3.01    33
225520220000    2018-11-01 15:10:26   423.3.01    34
225520220000    2018-11-01 13:20:20   423.3.01    38
225520220000    2018-11-01 11:30:11   423.3.01    37
225520220000    2018-11-01 09:40:03   423.3.01    35
225520220000    2018-11-01 07:49:03   423.3.01    35
225520220000    2018-11-01 05:59:50   423.3.01    34
225520220000    2018-11-01 04:09:43   423.3.01    34
225520220000    2018-11-01 02:19:34   423.3.01    34

我需要的是一个查询,它可以为我提供过去 24 小时内所有路边的平均 ssi。结果应该是:

wayside         date         base        avg_ssi
225520220000    2018-11-01   423.3.01    34
225520230000    2018-11-01   423.2.21    21
225520240000    2018-11-01   423.4.11    18
225520250000    2018-11-01   423.1.21    55
225520260000    2018-11-01   422.2.01    62
225520270000    2018-11-01   452.3.07    33
225520280000    2018-11-01   425.1.03    25

我只需要平均 ssi 的整数值,如图所示。

我已尝试在 SELECT 语句中使用 AVG(ssi),但我不确定如何将其应用于选定时间段内的所有路边值。例如,在原始查询中, 我在 SELECT 行中添加了“AVG(ssi) as avg_ssi”,但它只为每条记录生成“平均”SSI,与 SSI 值相同。

我的这个查询的伪 SQL 版本是“显示给定日期每个路边的 24 小时平均 SSI”。

【问题讨论】:

    标签: sql sql-server syntax


    【解决方案1】:

    您可以尝试在CONVERT(char(10), timestamp,126) 上使用avggroup by 让日期时间为yyyy-MM-dd 格式group by 每个日期。

    select wayside,CONVERT(char(10), timestamp,126),base,avg(ssi) as avg_ssi
    from BASE_SSI 
    where timestamp > DATEADD(day,-7,getdate()) and timestamp < DATEADD(day,-6,getdate())
    group by CONVERT(char(10), timestamp,126),base,wayside
    order by timestamp desc
    

    编辑

    根据您的评论,您可以尝试使用ROW_NUMBER 窗口函数来获取每个base 的第一个ssi

    SELECT wayside,
           CONVERT(char(10), timestamp,126),
           base,
           ssi as avg_ssi 
    FROM (
        select wayside,timestamp,base,ssi,Row_number() over(partition by base order by timestamp) rn
        from BASE_SSI 
        where timestamp > DATEADD(day,-7,getdate()) and timestamp < DATEADD(day,-6,getdate())
    ) t1
    where rn = 1
    order by timestamp desc
    

    【讨论】:

    • 这里的 'avg_ssi' 列返回组的第一个 ssi 值,而不是样本中所有 14 个 ssi 值的平均值。换句话说,ssi 是 26 而不是 24,这是手动计算的平均值。
    • @user3235770 您能否提供一些来自BASE_SSI 表的示例数据?
    • 因为我只在您的示例数据中看到了base = 423.3.01
    • @user3235770 如果我理解正确你可以试试我的编辑答案
    • 首先,我在表模式中犯了一个错误:路边列没有主键,所以同一个路边可以有很多条目。为了检查这些查询,我从头开始创建了这个表,只有两行:wayside timestamp base ssi 225520220000 2018-11-02 00:21:09 423.3.01 15 225520220000 2018-11-01 22:31:03 423.3.01 45
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多