Re: How to group this?

"Keith Medcalf" <[email protected]>
Newsgroups gmane.comp.db.sqlite.general
Organization This Side Up
Message-ID <[email protected]>
That's good, but this not screw up later userid/date if an entry is AWOL.

    WITH systolic 
      AS (
          select userid,
                 date,
                 rank() over (partition by userid, date order by id) as rank, 
                 reading 
            from pressure 
           where term == 'Systolic'
         ),
         diastolic 
      AS (
          select userid,
                 date,
                 rank() over (partition by userid, date order by id) as rank, 
                 reading 
            from pressure 
           where term == 'Diastolic'
         )
    SELECT d.userid,
           d.date,
           s.reading || '/' || d.reading AS Reading
      FROM systolic s
      JOIN diastolic d
        ON d.userid == s.userid
       AND d.date == s.date
       AND d.rank == s.rank
    ;



-- 
The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume.

>-----Original Message-----
>From: sqlite-users <[email protected]> On
>Behalf Of [email protected]
>Sent: Sunday, 9 February, 2020 18:26
>To: SQLite mailing list <[email protected]>
>Subject: Re: [sqlite] How to group this?
>
>On Mon Feb 10, 2020 at 12:24:33AM +0000, Bart Smissaert wrote:
>> I should get:
>>
>> 127/81
>> 132/82
>> 141/85
>> 143/94
>>
>> What should be the SQL to group like this?
>
>Here is one way that appears to generate the correct result.
>
>    CREATE TABLE pressure(
>        id INTEGER PRIMARY KEY,
>        userid INTEGER NOT NULL,
>        date TEXT NOT NULL,
>        term text NOT NULL,
>        reading INTEGER NOT NULL
>    );
>
>    INSERT INTO
>        pressure(userid,date,term,reading,id)
>    VALUES
>        (1308,'15/Mar/2013','Systolic',127,701559),
>        (1308,'15/Mar/2013','Diastolic',81,701568),
>        (1308,'27/Jun/2013','Systolic',132,701562),
>        (1308,'27/Jun/2013','Systolic',141,701563),
>        (1308,'27/Jun/2013','Systolic',143,701564),
>        (1308,'27/Jun/2013','Diastolic',82,701571),
>        (1308,'27/Jun/2013','Diastolic',85,701572),
>        (1308,'27/Jun/2013','Diastolic',94,701573),
>        (278975701,'08/Mar/2018','Systolic',136,1583551),
>        (278975701,'08/Mar/2018','Diastolic',99,1583591),
>        (278975701,'04/Apr/2018','Systolic',119,1583552),
>        (278975701,'04/Apr/2018','Systolic',124,1583553),
>        (278975701,'04/Apr/2018','Systolic',130,1583554),
>        (278975701,'04/Apr/2018','Diastolic',74,1583592),
>        (278975701,'04/Apr/2018','Diastolic',75,1583593),
>        (278975701,'04/Apr/2018','Diastolic',85,1583594);
>
>    WITH
>        systolic AS (
>            SELECT
>                row_number() OVER (order by id) AS row,
>                *
>            FROM
>                pressure
>            WHERE
>                term='Systolic'
>        ),
>        diastolic AS (
>            SELECT
>                row_number() OVER (order by id) AS row,
>                *
>            FROM
>                pressure
>            WHERE
>                term='Diastolic'
>        )
>    SELECT
>        d.userid AS User,
>        d.date AS Date,
>        s.reading || '/' || d.reading AS Reading
>    FROM
>        systolic s
>    LEFT JOIN
>        diastolic d
>    ON
>        d.row=s.row
>    ORDER BY
>        d.userid,
>        d.date,
>        d.id
>    ;
>
>I'm sure others will produce more elegant solutions - I was just using
>your question as an exercise to learn about window functions. The query
>plan of the above looks a little scary though:
>
>     id   parent  notused  detail
>     2    0       0        CO-ROUTINE 1
>     9    2       0        CO-ROUTINE 4
>     12   9       0        SCAN TABLE pressure
>     26   2       0        SCAN SUBQUERY 4
>     72   0       0        MATERIALIZE 2
>     79   72      0        CO-ROUTINE 5
>     82   79      0        SCAN TABLE pressure
>     97   72      0        SCAN SUBQUERY 5
>     144  0       0        SCAN SUBQUERY 1 AS s
>     159  0       0        SEARCH SUBQUERY 2 AS d USING AUTOMATIC
>COVERING INDEX
>                           (row=?)
>     180  0       0        USE TEMP B-TREE FOR ORDER BY
>
>Presumably if you index the date/userid and filter the CTE tables it
>gets a little better.
>
>--
>Mark Lawrence
>_______________________________________________
>sqlite-users mailing list
>[email protected]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.