Сравнение размеров в друиде - PullRequest
0 голосов
/ 21 января 2020

Я недавно начал экспериментировать с друидом. У меня есть сценарий использования, который я не могу решить. У меня есть 3 столбца даты primary_date, date_1 и date_2, сумма и клиент.

Я хотел вычислить сумму (сумму), когда date_1> date_2, когда гранулярность - месяц. Я хотел рассчитать это для каждого месяца с интервалом в 6 месяцев для каждого клиента.

Я также хотел рассчитать сумму (сумму), когда date_1> max (дата сегмента) для каждого сегмента в течение 6 месяцев для каждого клиента.

{
    "queryType" : "groupBy",
    "dataSource" : "data_source_xxx",
    "granularity" : "month",
    "dimensions" : ["client"],
    "intervals": ["2019-01-01/2019-07-01"],
    "aggregations":[{"type": "doubleSum", "name": "total_amount", "fieldName": "amount"}],
    "filter" : { 
        "type": "select",
        "dimension": "client",
        "value": "client" 
    }   
}

Я хотел изменить вышеупомянутый запрос, чтобы иметь дополнительные фильтры, о которых я упоминал.

Любая помощь высоко ценится.

Спасибо

1 Ответ

0 голосов
/ 28 января 2020

Я думаю, вы можете реализовать это с помощью виртуального столбца, который выполняет сравнение дат. Тогда вы сможете использовать виртуальный столбец в отфильтрованной агрегации, которая применяет агрегацию только в том случае, если фильтр соответствует.

Это не проверено, но я думаю, что-то вроде этого должно работать:

{
    "queryType": "groupBy",
    "dataSource": "data_source_xxx",
    "intervals": [
        "2019-01-01T00:00:00.000Z/2019-07-01T00:00:00.000Z"
    ],
    "dimensions": [
        {
            "type": "default",
            "dimension": "client",
            "outputType": "string",
            "outputName": "client"
        }
    ],
    "granularity": "month",
    "aggregations": [
        {
            "type": "filtered",
            "filter": {
                "type": "selector",
                "dimension": "isOlder",
                "value": "1"
            },
            "aggregator": {
                "type": "doubleSum",
                "name": "sumAmount",
                "fieldName": "amount"
            }
        }
    ],
    "virtualColumns": [
        {
            "type": "expression",
            "name": "isOlder",
            "expression": "if( date_1 > date_2, '1', '0')",
            "outputType": "string"
        }
    ],
    "context": {
        "groupByStrategy": "v2"
    }
}

Я создал это, используя этот код PHP, используя этот пакет: https://github.com/level23/druid-client

$client = new DruidClient(['router_url' => 'http://127.0.0.1:8888']);

// Build a select query
$builder = $client->query('data_source_xxx', Granularity::MONTH)
    ->interval("2019-01-01/2019-07-01")
    ->select(['client'])
    ->virtualColumn("if( date_1 > date_2, '1', '0')", 'isOlder')
    ->sum('amount', 'sumAmount', DataType::DOUBLE, function(FilterBuilder $filterBuilder){
        $filterBuilder->where('isOlder', '=', '1');
    });

echo $builder->toJson();
...