简体   繁体   English

参数化聚集的最佳方法

[英]Best approach to parametrized aggregates

I am gathering analytics for my app. 我正在为我的应用收集分析数据。 For each metric I track, I allow it to be viewed over an interval of 7, 30 or 90 days, along with grouping by date, by weekday or by time of day. 对于我跟踪的每个指标,我允许在7天,30天或90天的时间间隔内查看它,并按日期,工作日或一天中的时间进行分组。

What's the best approach to handle this? 处理此问题的最佳方法是什么?

Is it possible to avoid having perform 6 different queries 6 for each metric (1 for each interval, one for each grouping)? 是否可以避免对每个指标执行6个不同的查询6(每个间隔1个,每个分组1个)?

Example

Median conversation response time (group by day of week) Analytic(mon, tue, wed..) 会话中位数响应时间(按星期几分组) Analytic(mon, tue, wed..)

Median conversation response time (group by time of day) Analytic(1 am, 2 am, 3 am..) 中位会话响应时间(按一天中的时间分组) Analytic(1 am, 2 am, 3 am..)

New conversations (group by day of week) Analytic(mon, tue, wed..) 新会话(按星期几分组) Analytic(mon, tue, wed..)

New conversations (group by date) Analytic(20 aug, 19 aug, 18 aug etc...) 新会话(按日期分组) Analytic(20 aug, 19 aug, 18 aug etc...)

Sorry for mixing a little posgressql whit sql-server. 对不起,混合了一点posgressql和sql-server。 The @... (eg @Param) are sql-server syntax for variable I don't know postgressql syntax for it but hopefully this will still illustrate the technique. @ ...(例如,@ Param)是变量的sql-server语法,我不知道它的postgressql语法,但希望它仍然可以说明该技术。

SELECT
    date
    ,CASE
       WHEN @Param = 'date' THEN date AS
       WHEN @Param = 'dow' THEN EXTRACT(DOW FROM date)
       ....
       ELSE
    END as ParamGRoup
     ,SUM(amount) as TotalAmount
FROM
    Table
WHERE
    date BETWEEN @LowDateParam TO @HighDateParam
GROUP BY
    date
    ,CASE
       WHEN @Param = 'date' THEN date AS
       WHEN @Param = 'dow' THEN EXTRACT(DOW FROM date)
       ....
       ELSE
    END as ParamGRoup

I typed this before you got your example out so I hope it is still clear. 我在输入示例之前输入了此内容,因此希望它仍然很清楚。 Anyway, one way you can do it is to use a case statement and then group by the same case statement. 无论如何,一种实现方法是使用case语句,然后将同一case语句分组。 You may have to cast the THEN/Else portions of case statement as a VARCHAR or something to ensure consistent datatype if it is ever possible for it to be grouped by multiple levels but it should get you there. 如果可能将其按多个级别分组,则可能必须将case语句的THEN / Else部分强制转换为VARCHAR或某种形式,以确保数据类型一致,但应该可以使您到达那里。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM