INFORMIX: счетчик каждого имени элемента из подзапроса с разным callid и значением Max varable - PullRequest
1 голос
/ 13 июня 2019

Вот мои таблицы:

1

2

Мне нужно получить счетчик имени элемента для каждого callid, где имя переменной равно 'eCounter', а значение переменной наибольшее.

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

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

ВЫБЕРИТЕ МАКС. (A.varvalue) как MAXvarvalue, b.callgui ОТ элементаdetail AS a, элемент AS b ГДЕ (a.elementid = b.elementid) И (a.varname = 'eCounter') GROUP BY varname, callguid

Это то, что мне нужно, чтобы результаты были похожи.

3

1 Ответ

1 голос
/ 15 июня 2019

Использование последней версии Informix (14.10.XC1).

Предполагается, что следующие таблицы:

CREATE TABLE element
(
    callid      INTEGER,
    elementid   BIGINT,
    elementname CHAR( 20 )
);

CREATE TABLE elementdetail
(
    elementid   BIGINT,
    varname     CHAR( 20 ),
    varvalue    INTEGER
);

, которые заполнены вашими образцами данных (OCR для спасения, вы действительно должныопубликуйте ваши образцы данных и таблицы в виде текста, а не изображений):

INSERT INTO element VALUES ( 1, 1001901560322810000, 'set_Page1' );
INSERT INTO element VALUES ( 1, 1001921560322810000, 'set_Page5' );
INSERT INTO element VALUES ( 1, 1001181560322820000, 'set_Page4' );
INSERT INTO element VALUES ( 1, 1001021560322820000, 'set_Page3' );
INSERT INTO element VALUES ( 1, 1001331560322830000, 'set_Page6' );
INSERT INTO element VALUES ( 2, 1002281560322920000, 'set_Page1' );
INSERT INTO element VALUES ( 2, 1002301560322920000, 'set_Page5' );
INSERT INTO element VALUES ( 2, 1002881560322940000, 'set_Page4' );
INSERT INTO element VALUES ( 3, 1002271560322950000, 'set_Page1' );
INSERT INTO element VALUES ( 3, 1002951560322970000, 'set_Page4' );
INSERT INTO element VALUES ( 3, 1002231560322980000, 'set_Page6' );
INSERT INTO element VALUES ( 4, 1002781560323000000, 'set_Page1' );
INSERT INTO element VALUES ( 4, 1002891560323020000, 'set_Page5' );
INSERT INTO element VALUES ( 4, 1002391560323040000, 'set_Page4' );

INSERT INTO elementdetail VALUES ( 1001901560322810000, 'eCounter', 0 );
INSERT INTO elementdetail VALUES ( 1001901560322810000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1001921560322810000, 'eCounter', 1 );
INSERT INTO elementdetail VALUES ( 1001921560322810000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1001181560322820000, 'eCounter', 2 );
INSERT INTO elementdetail VALUES ( 1001181560322820000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1001021560322820000, 'eCounter', 4 );
INSERT INTO elementdetail VALUES ( 1001021560322820000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1001331560322830000, 'eCounter', 5 );
INSERT INTO elementdetail VALUES ( 1001331560322830000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002281560322920000, 'eCounter', 0 );
INSERT INTO elementdetail VALUES ( 1002281560322920000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002301560322920000, 'eCounter', 1 );
INSERT INTO elementdetail VALUES ( 1002301560322920000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002881560322940000, 'eCounter', 2 );
INSERT INTO elementdetail VALUES ( 1002881560322940000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002271560322950000, 'eCounter', 0 );
INSERT INTO elementdetail VALUES ( 1002271560322950000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002951560322970000, 'eCounter', 1 );
INSERT INTO elementdetail VALUES ( 1002951560322970000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002231560322980000, 'eCounter', 2 );
INSERT INTO elementdetail VALUES ( 1002231560322980000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002781560323000000, 'eCounter', 0 );
INSERT INTO elementdetail VALUES ( 1002781560323000000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002891560323020000, 'eCounter', 1 );
INSERT INTO elementdetail VALUES ( 1002891560323020000, 'other_variables', NULL );
INSERT INTO elementdetail VALUES ( 1002391560323040000, 'eCounter', 2 );
INSERT INTO elementdetail VALUES ( 1002391560323040000, 'other_variables', NULL );

Мы можем сделать что-то подобное, используя CTE:

WITH cte_element AS
(
    SELECT
        e.callid,
        e.elementname,
        d.varvalue
    FROM
        element AS e
    INNER JOIN
        elementdetail AS d
    ON
        e.elementid = d.elementid
    WHERE
        d.varname = 'eCounter'
    ORDER BY
        e.callid,
        d.varvalue
) 
SELECT
    vt1.elementname,
    COUNT( vt1.elementname ) AS count_elementname
FROM
(
    SELECT
        tmp1.callid,
        tmp1.elementname,
        tmp1.varvalue
    FROM
        cte_element AS tmp1
    WHERE
        tmp1.varvalue = 
        (
            SELECT 
                MAX( tmp2.varvalue )
            FROM
                cte_element AS tmp2
            WHERE
                tmp1.callid = tmp2.callid
            GROUP BY
                tmp2.callid
        )
) AS vt1
GROUP BY
    vt1.elementname
;

-- Results
elementname          count_elementname

set_Page6                            2
set_Page4                            2

Все еще используя последнюю версиюInformix, используя управление окном вместо CTE:

SELECT
    vt1.elementname,
    COUNT( vt1.elementname ) AS count_elementname
FROM
(
SELECT
    e.callid,
    e.elementname,
    d.varvalue,
    RANK() OVER 
    ( 
        PARTITION BY e.callid ORDER BY e.callid, d.varvalue DESC 
    ) AS rank
FROM
    element AS e
INNER JOIN
    elementdetail AS d
ON
    e.elementid = d.elementid
WHERE
    d.varname = 'eCounter'
ORDER BY
    e.callid,
    d.varvalue
) AS vt1
WHERE
    vt1.rank = 1
GROUP BY
    vt1.elementname
;

-- Results
elementname          count_elementname

set_Page6                            2
set_Page4                            2

В более старой версии Informix, без CTE или окон, поэтому мы используем временную таблицу:

SELECT
    e.callid,
    e.elementname,
    d.varvalue
FROM
    element AS e
INNER JOIN
    elementdetail AS d
ON
    e.elementid = d.elementid
WHERE
    d.varname = 'eCounter'
ORDER BY
    e.callid,
    d.varvalue
INTO TEMP temp_element 
;

SELECT
    vt1.elementname,
    COUNT( vt1.elementname ) AS count_elementname
FROM
(
    SELECT
        tmp1.callid,
        tmp1.elementname,
        tmp1.varvalue
    FROM
        temp_element AS tmp1
    WHERE
        tmp1.varvalue = 
        (
            SELECT 
                MAX( tmp2.varvalue )
            FROM
                temp_element AS tmp2
            WHERE
                tmp1.callid = tmp2.callid
            GROUP BY
                tmp2.callid
        )
) AS vt1
GROUP BY
    vt1.elementname
;

-- Results
elementname          count_elementname

set_Page6                            2
set_Page4                            2

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

Я не проверял ни одного углового случая, например, когда callid имеет 2 elementname с такими же значениями eCounter varvalue.

...