Sql 由于案例,配置单元中的表为空

Sql 由于案例,配置单元中的表为空,sql,hiveql,Sql,Hiveql,我最近开始学习sql,之前没有任何编码经验,所以在这种情况下,这可能只是一个愚蠢的错误,很抱歉发了这么长的帖子:。如果你能帮我解决当前的问题,那就太好了 我有一张像这样的桌子 id/n特定事件的名称/utc时间戳/json\u数据包含多个参数的json字符串 我的目标很简单:我试图获得json_数据中的值参数的总和,按n分组。不幸的是,有些问题使执行变得更加复杂 我们有一个垃圾邮件问题,导致相同的事件被发送数百或数千次,需要过滤掉。我通常通过在group子句中使用utc时间戳来解决这个问题,该子

我最近开始学习sql,之前没有任何编码经验,所以在这种情况下,这可能只是一个愚蠢的错误,很抱歉发了这么长的帖子:。如果你能帮我解决当前的问题,那就太好了

我有一张像这样的桌子

id/n特定事件的名称/utc时间戳/json\u数据包含多个参数的json字符串

我的目标很简单:我试图获得json_数据中的值参数的总和,按n分组。不幸的是,有些问题使执行变得更加复杂

我们有一个垃圾邮件问题,导致相同的事件被发送数百或数千次,需要过滤掉。我通常通过在group子句中使用utc时间戳来解决这个问题,该子句还将包括其他选定的列,并获得每个特定事件的一个实例

有些事件在其值字段中返回负值,需要从所有计数和求和中忽略这些值

由于事情并非易事,json_数据列中的值字段的名称总是不同的,这取决于发送的事件类型。然而,我通过在我的查询中可以看到的各种字符串操作基本上解决了这个问题

这是我到目前为止得到的

SELECT
b.Event_Name as Event_Name
, COUNT(b.Event_Name) as event_occurrences
, SUM(b.item_value) as user_spendings
FROM
    (SELECT
        a.id as Player_ID
        , a.n as Event_Name
        , a.utc as timing
        , CASE 
            WHEN 
                MAX( a.ALPHA_Value
                + a.BETA_Value
                + a.GAMMA_Value
                + a.DELTA_Value
                + a.EPSILON_Value
                + a.BETAUPGRADE_Value
                + a.ZETA_Value
                + a.ALPHASKIN_Value
                + a.UPGRADEALPHA_Value) <= 0 
            THEN 0 
            ELSE 
                MAX(a.ALPHA_Value
                + a.BETA_Value
                + a.GAMMA_Value
                + a.DELTA_Value
                + a.EPSILON_Value
                + a.BETAUPGRADE_Value
                + a.ZETA_Value
                + a.ALPHASKIN_Value
                + a.UPGRADEALPHA_Value) END as item_value
        FROM
            (SELECT
                id
                , n
                , utc
                , MAX(TRIM(get_json_object(json_data, '$. ALPHA_Value '))) as ALPHA_Value
                , MAX(TRIM(get_json_object(json_data, '$. BETA_Value '))) as BETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6))-1))) as GAMMA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. DELTA_Value ')), 6)) as DELTA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. EPSILON_Value ')), 6)) as EPSILON_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. BETAUPGRADE_Value ')), 6)) as BETAUPGRADE_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ZETA_Value ')), 6)) as ZETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ALPHASKIN_Value ')), 6)) as ALPHASKIN_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6))-1))) as UPGRADEALPHA_Value
                FROM application_events
                WHERE
                    month = 201409
                    AND FROM_UNIXTIME(utc_timestamp) > '2014-09-04 12:00:00'
                GROUP BY id, n, utc
                ORDER BY id, n
            ) a
        GROUP by a.id, a.n, a.utc
        ORDER by timing, Event_Name
    ) b
WHERE b.item_value > 0
GROUP by b.Event_Name
ORDER by user_spendings
我的理由如下:

我从json_数据中获取值,同时使用GROUP by id、n、utc清除垃圾邮件。我在get_json_对象上使用MAX来允许与前面的列进行分组。由于id、名称和时间戳的组合除了spam ofc之外是唯一的,因此MAX将在相同的值上工作。 由于每个事件只有一个值字段,其名称根据事件类型而不同,因此我将拥有所有列,但只有一个列具有值,其他列将为空

我去掉了负值:现在,由于我无法在where子句中输入一个和,我唯一能想到的方法是创建另一个表b,它将检查a中所有值列的和是否为负值,正如我所说的,它们除了一个之外都是空的,因此如果有负值,那么和也将为负值,如果总和没有别名为项_值,则返回总和

第三个表将最终统计事件的数量并求和这些值

我目前的问题是在第2步。当我运行子查询a时,它看起来很好,我得到了结果。当我在原始查询中运行一个计算事件和求和值的查询时,我也会得到结果。所以我猜我放置条件的方式有问题,因为完整的查询在表中没有给出任何结果

我试着把总数放在WHERE子句中,但没有成功。任何想法都是受欢迎的,特别是如果你知道更简单的方法


非常感谢各位。

您的查询看起来是正确的,我删除了一些额外的部分,但这不是必要的:

SELECT
b.Event_Name as Event_Name
, COUNT(b.Event_Name) as event_occurrences
, SUM(b.item_value) as user_spendings
FROM (SELECT
        a.id as Player_ID
        , a.n as Event_Name
        , a.utc as timing
          COALESCE(a.ALPHA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.BETA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.GAMMA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.DELTA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.EPSILON_Value, CAST(0 AS BIGINT))
        + COALESCE(a.BETAUPGRADE_Value, CAST(0 AS BIGINT))
        + COALESCE(a.ZETA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.ALPHASKIN_Value, CAST(0 AS BIGINT))
        + COALESCE(a.UPGRADEALPHA_Value, CAST(0 AS BIGINT)) as item_value
        FROM (SELECT
                id
                , n
                , utc
                , MAX(TRIM(get_json_object(json_data, '$. ALPHA_Value '))) as ALPHA_Value
                , MAX(TRIM(get_json_object(json_data, '$. BETA_Value '))) as BETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6))-1))) as GAMMA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. DELTA_Value ')), 6)) as DELTA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. EPSILON_Value ')), 6)) as EPSILON_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. BETAUPGRADE_Value ')), 6)) as BETAUPGRADE_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ZETA_Value ')), 6)) as ZETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ALPHASKIN_Value ')), 6)) as ALPHASKIN_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6))-1))) as UPGRADEALPHA_Value
                FROM application_events
                WHERE
                    month = 201409
                    AND FROM_UNIXTIME(utc_timestamp) > '2014-09-04 12:00:00'
                GROUP BY id, n, utc
            ) a
    ) b
WHERE b.item_value > 0
GROUP by b.Event_Name
ORDER by user_spendings
我假设您尝试求和的某些值为空。所以我加了聚结


另外,您不需要子查询b,您也可以在子查询a中执行同样的操作,但为了更好的可读性,我没有碰这个

谢谢,我将运行它。空列返回/N,用一个数值求和是什么使查询返回一个空表?@QuiZzer是的,我想是的