How to check if dates are ascending in PostgreSQL?












-1















How can I determine if rows from child table have ascending date or not? My sample data is next



table Person



id    name   
1 Bob
2 Sara
3 Mike


table Appointments



id    id_apt  date   
1 1 2018-01-31
1 2 2018-01-31
1 3 2018-02-05
2 1 2018-01-15
2 2 2018-01-07
2 3 2018-01-09
3 1 2018-01-18


From my sample data I should get only row 2 - Sara because her appointments



2     1       2018-01-15
2 2 2018-01-07
2 3 2018-01-09


are not in ascending date order. If person have 1 appointment or no appointment at all, that person has valid appointments and I only check for persons which have invalid appointments.



Thanks in advance










share|improve this question



























    -1















    How can I determine if rows from child table have ascending date or not? My sample data is next



    table Person



    id    name   
    1 Bob
    2 Sara
    3 Mike


    table Appointments



    id    id_apt  date   
    1 1 2018-01-31
    1 2 2018-01-31
    1 3 2018-02-05
    2 1 2018-01-15
    2 2 2018-01-07
    2 3 2018-01-09
    3 1 2018-01-18


    From my sample data I should get only row 2 - Sara because her appointments



    2     1       2018-01-15
    2 2 2018-01-07
    2 3 2018-01-09


    are not in ascending date order. If person have 1 appointment or no appointment at all, that person has valid appointments and I only check for persons which have invalid appointments.



    Thanks in advance










    share|improve this question

























      -1












      -1








      -1








      How can I determine if rows from child table have ascending date or not? My sample data is next



      table Person



      id    name   
      1 Bob
      2 Sara
      3 Mike


      table Appointments



      id    id_apt  date   
      1 1 2018-01-31
      1 2 2018-01-31
      1 3 2018-02-05
      2 1 2018-01-15
      2 2 2018-01-07
      2 3 2018-01-09
      3 1 2018-01-18


      From my sample data I should get only row 2 - Sara because her appointments



      2     1       2018-01-15
      2 2 2018-01-07
      2 3 2018-01-09


      are not in ascending date order. If person have 1 appointment or no appointment at all, that person has valid appointments and I only check for persons which have invalid appointments.



      Thanks in advance










      share|improve this question














      How can I determine if rows from child table have ascending date or not? My sample data is next



      table Person



      id    name   
      1 Bob
      2 Sara
      3 Mike


      table Appointments



      id    id_apt  date   
      1 1 2018-01-31
      1 2 2018-01-31
      1 3 2018-02-05
      2 1 2018-01-15
      2 2 2018-01-07
      2 3 2018-01-09
      3 1 2018-01-18


      From my sample data I should get only row 2 - Sara because her appointments



      2     1       2018-01-15
      2 2 2018-01-07
      2 3 2018-01-09


      are not in ascending date order. If person have 1 appointment or no appointment at all, that person has valid appointments and I only check for persons which have invalid appointments.



      Thanks in advance







      postgresql






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 20 '18 at 12:01









      KuKeCKuKeC

      2,80031439




      2,80031439
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Two calls of the window function row_number() show whether sort orders by id and by date differ:



          select 
          *,
          row_number() over (partition by id order by id_apt) as by_id,
          row_number() over (partition by id order by date, id_apt) by_date
          from appointments

          id | id_apt | date | by_id | by_date
          ----+--------+------------+-------+---------
          1 | 1 | 2018-01-31 | 1 | 1
          1 | 2 | 2018-01-31 | 2 | 2
          1 | 3 | 2018-02-05 | 3 | 3
          2 | 2 | 2018-01-07 | 2 | 1
          2 | 3 | 2018-01-09 | 3 | 2
          2 | 1 | 2018-01-15 | 1 | 3
          3 | 1 | 2018-01-18 | 1 | 1
          (7 rows)


          In the final query use the boolean aggregate bool_or():



          select a.id, p.name
          from (
          select
          id,
          row_number() over (partition by id order by id_apt) as by_id,
          row_number() over (partition by id order by date, id_apt) by_date
          from appointments
          ) a
          join person p using(id)
          group by id, name
          having bool_or(by_id <> by_date);

          id | name
          ----+------
          2 | Sara
          (1 row)





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392576%2fhow-to-check-if-dates-are-ascending-in-postgresql%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Two calls of the window function row_number() show whether sort orders by id and by date differ:



            select 
            *,
            row_number() over (partition by id order by id_apt) as by_id,
            row_number() over (partition by id order by date, id_apt) by_date
            from appointments

            id | id_apt | date | by_id | by_date
            ----+--------+------------+-------+---------
            1 | 1 | 2018-01-31 | 1 | 1
            1 | 2 | 2018-01-31 | 2 | 2
            1 | 3 | 2018-02-05 | 3 | 3
            2 | 2 | 2018-01-07 | 2 | 1
            2 | 3 | 2018-01-09 | 3 | 2
            2 | 1 | 2018-01-15 | 1 | 3
            3 | 1 | 2018-01-18 | 1 | 1
            (7 rows)


            In the final query use the boolean aggregate bool_or():



            select a.id, p.name
            from (
            select
            id,
            row_number() over (partition by id order by id_apt) as by_id,
            row_number() over (partition by id order by date, id_apt) by_date
            from appointments
            ) a
            join person p using(id)
            group by id, name
            having bool_or(by_id <> by_date);

            id | name
            ----+------
            2 | Sara
            (1 row)





            share|improve this answer




























              0














              Two calls of the window function row_number() show whether sort orders by id and by date differ:



              select 
              *,
              row_number() over (partition by id order by id_apt) as by_id,
              row_number() over (partition by id order by date, id_apt) by_date
              from appointments

              id | id_apt | date | by_id | by_date
              ----+--------+------------+-------+---------
              1 | 1 | 2018-01-31 | 1 | 1
              1 | 2 | 2018-01-31 | 2 | 2
              1 | 3 | 2018-02-05 | 3 | 3
              2 | 2 | 2018-01-07 | 2 | 1
              2 | 3 | 2018-01-09 | 3 | 2
              2 | 1 | 2018-01-15 | 1 | 3
              3 | 1 | 2018-01-18 | 1 | 1
              (7 rows)


              In the final query use the boolean aggregate bool_or():



              select a.id, p.name
              from (
              select
              id,
              row_number() over (partition by id order by id_apt) as by_id,
              row_number() over (partition by id order by date, id_apt) by_date
              from appointments
              ) a
              join person p using(id)
              group by id, name
              having bool_or(by_id <> by_date);

              id | name
              ----+------
              2 | Sara
              (1 row)





              share|improve this answer


























                0












                0








                0







                Two calls of the window function row_number() show whether sort orders by id and by date differ:



                select 
                *,
                row_number() over (partition by id order by id_apt) as by_id,
                row_number() over (partition by id order by date, id_apt) by_date
                from appointments

                id | id_apt | date | by_id | by_date
                ----+--------+------------+-------+---------
                1 | 1 | 2018-01-31 | 1 | 1
                1 | 2 | 2018-01-31 | 2 | 2
                1 | 3 | 2018-02-05 | 3 | 3
                2 | 2 | 2018-01-07 | 2 | 1
                2 | 3 | 2018-01-09 | 3 | 2
                2 | 1 | 2018-01-15 | 1 | 3
                3 | 1 | 2018-01-18 | 1 | 1
                (7 rows)


                In the final query use the boolean aggregate bool_or():



                select a.id, p.name
                from (
                select
                id,
                row_number() over (partition by id order by id_apt) as by_id,
                row_number() over (partition by id order by date, id_apt) by_date
                from appointments
                ) a
                join person p using(id)
                group by id, name
                having bool_or(by_id <> by_date);

                id | name
                ----+------
                2 | Sara
                (1 row)





                share|improve this answer













                Two calls of the window function row_number() show whether sort orders by id and by date differ:



                select 
                *,
                row_number() over (partition by id order by id_apt) as by_id,
                row_number() over (partition by id order by date, id_apt) by_date
                from appointments

                id | id_apt | date | by_id | by_date
                ----+--------+------------+-------+---------
                1 | 1 | 2018-01-31 | 1 | 1
                1 | 2 | 2018-01-31 | 2 | 2
                1 | 3 | 2018-02-05 | 3 | 3
                2 | 2 | 2018-01-07 | 2 | 1
                2 | 3 | 2018-01-09 | 3 | 2
                2 | 1 | 2018-01-15 | 1 | 3
                3 | 1 | 2018-01-18 | 1 | 1
                (7 rows)


                In the final query use the boolean aggregate bool_or():



                select a.id, p.name
                from (
                select
                id,
                row_number() over (partition by id order by id_apt) as by_id,
                row_number() over (partition by id order by date, id_apt) by_date
                from appointments
                ) a
                join person p using(id)
                group by id, name
                having bool_or(by_id <> by_date);

                id | name
                ----+------
                2 | Sara
                (1 row)






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 20 '18 at 13:03









                klinklin

                57.6k64980




                57.6k64980






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392576%2fhow-to-check-if-dates-are-ascending-in-postgresql%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith