【问题标题】:Extract most frequent value between two times提取两次之间最频繁的值
【发布时间】:2019-04-01 19:17:00
【问题描述】:

我是 Power Bi 的新手,需要一些帮助来提取时间段之间最频繁的值。在下表中,您可以看到下午 1 点到 2 点时间段之间最频繁的值是 E360,而下午 2 点到 3 点之间最频繁的值是 A178。请帮助我在 Power BI 中执行此操作。

item    Timestamp                
E360    03/11/2019 01:00:30              
E360    03/11/2019 01:07:02              
E360    03/11/2019 01:08:32              
E360    03/11/2019 01:11:02     
E360    03/11/2019 01:18:03     
E360    03/11/2019 01:20:53     
E360    03/11/2019 01:23:49              
E360    03/11/2019 01:26:31              
E360    03/11/2019 01:50:55              
E360    03/11/2019 01:54:08              
E360    03/11/2019 01:56:21              
E360    03/11/2019 02:04:08              
E360    03/11/2019 02:06:35              
E360    03/11/2019 02:09:13              
E360    03/11/2019 02:11:53              
E360    03/11/2019 02:14:27              
E360    03/11/2019 02:17:08              
A178    03/11/2019 02:19:49              
A178    03/11/2019 02:22:22              
A178    03/11/2019 02:33:49              
A178    03/11/2019 02:36:14              
A178    03/11/2019 02:49:35              
A178    03/11/2019 02:52:56              
A178    03/11/2019 02:55:16              
A178    03/11/2019 02:57:43              
A178    03/11/2019 03:00:31

我上面显示的数据是原始数据,我在 Power BI 中创建了另一个表。我正在尝试添加一个在那一小时内具有最可能值的列。请帮我这样做。

Timestamp StartTime     Timestamp End Time        Most probable Value
03/11/2019 01:00:00     03/11/2019 02:00:00       E360
03/11/2019 02:00:00     03/11/2019 03:00:00       A178

我想为每小时添加一列最可能的值

【问题讨论】:

    标签: sql powerbi dax


    【解决方案1】:

    在 Power BI 中,您可以执行以下操作:

    要么创建一个具有日期-小时分辨率的日历,然后在数据表中创建一个日期-小时计算列。或者创建一个分辨率为 1 秒的日历(如果您的数据表包含很多天,则不推荐)

    Calendar = 
    SELECTCOLUMNS(
        CROSSJOIN(
            CALENDAR(DATE(2019;3;1); DATE(2019;3;31));
            GENERATESERIES(
                0;
                TIME(23;0;0);
                TIME(1;0;0)
            )
        );
        "dateTime";  [Date]& " " &[Value]  
    )
    

    数据表中的计算列:

    DateHour = 
    DATE(
        YEAR(Data[dateTime]); 
        MONTH(Data[dateTime]); 
        DAY(Data[dateTime])
        )& " " & 
        TIME(HOUR(Data[dateTime]); 0; 0)    
    
    

    在日历和新的日期-小时列之间创建关系。

    然后添加以下度量:

    MostProbableValue = 
    MINX (
        TOPN (
            1;
            ADDCOLUMNS (
                VALUES ( Data[item] );
                "Frequency"; CALCULATE ( COUNT ( Data[item] ) )
            );
            [Frequency];
            0
        );
        Data[item]
    )
    

    在数据表中添加第二个计算列:

    Timestamp_EndTime = [DateHour]+Time(0; 59; 59)
    

    然后您可以通过拖动 [DateHour]、[Timestamp_EndTime] 和 MPV 度量来创建可视化表格。将 [DateHour] 列重命名为 Timestamp_Start],您最终会得到一个如下所示的表格:

    N.B:当您在表中写入时,不清楚时间戳恰好在 02:00:00 的值将被计算在哪个 bin 中,即使不是两次。因此,上限为 + 59 分 59 秒。如果您仍然希望它看起来像您编写的表格,请将计算列 [Timestamp_EndTime] 改为 +TIME(1;0;0)。

    此外,如果您知道数据表中的每个时间戳只有一个值,则实际上不需要日历。

    【讨论】:

    • 我已经用我需要的确切结果编辑了这个问题。你能检查一下并帮助我吗?谢谢。
    • 不完全确定您更新了什么,但我更改了回复以模仿您的表格。虽然我建议您更改限制(就像我所做的那样)以避免歧义。
    【解决方案2】:
    select item, count(*) cnt
    from table
    where <date time filter>
    group by item
    order by 2 desc
    

    这会给你每个计数。并按正确的顺序。现在要从该集合中获取第一行,您可以选择基于 db 引擎的各种技术。在 SQL 顶部 1. 在 oracle rownum

    select x.*
    from
    (
        select item, count(*) cnt
        from table
        where <date time filter>
        group by item
        order by 2 desc
    ) x
    where rownum < 2
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多