MySQL locate first and last event per day












0















I have a string of events being logged on a 5 minute basis throughout the day in a MySQL DB. I need to identify the first event (where logid > 0) of the day as well as the last (where logid=0), but struggling to find a simple SQL solution.



A 0 will be stored in the logid field in every row starting at midnight until the first event is triggered, at which point it will change to a number > 0. Then various events will be triggered logging a number > 0 for the remainder of the day, at which point the field will once again be logged as 0 until midnight, when the process starts over again.



Is there a quick and simple way to pull the rows identifying the time when the events start, and another result showing when the events end?



CREATE TABLE logs( 
id INT AUTO_INCREMENT,
date DATETIME,
logid INT,
PRIMARY KEY (id)
) ENGINE=INNODB;


This is the test data:



id  date                logid
1 2018-11-12 01:05:00 0
2 2018-11-12 01:10:00 0
3 2018-11-12 01:15:00 0
4 2018-11-12 01:20:00 0
5 2018-11-12 01:05:00 0

84 2018-11-12 06:35:00 0
85 2018-11-12 06:35:00 1
86 2018-11-12 06:40:00 1
87 2018-11-12 06:45:00 1
88 2018-11-12 06:50:00 1

164 2018-11-12 15:20:00 1
165 2018-11-12 15:25:00 0
166 2018-11-12 15:30:00 0
167 2018-11-12 15:35:00 0


Desired Result set:



85  2018-11-12 06:35:00 1   
165 2018-11-12 15:25:00 0


I'm not concerned about logid up until the first instance where it is greater than 0. But I need to identify the first instance where logid > 0, and then the next chronological instance where logid = 0 again.



My primary attempt was to group and order on the date and logid (edit: failed attempt removed for clarity)



Here's my latest attempt



       (SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date
limit 1
)UNION ALL(
SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date DESC
limit 1)


Getting closer, but not quite there. This gives me the correct first row where logid = 1, but it gives me the last row where logid = 1 (id 164) rather than the following row where logid = 0 (id=165).



Is it possible to select the penultimate row of a set if I change limit 1 to 2?
Any other pointers to keep me moving forward?










share|improve this question

























  • You should really show us some table data which explains the problem.

    – Tim Biegeleisen
    Nov 25 '18 at 6:37






  • 1





    Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

    – Madhur Bhaiya
    Nov 25 '18 at 6:40











  • You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

    – seand
    Nov 25 '18 at 7:25






  • 1





    Please add the corresponding expected output to the given sample data

    – Madhur Bhaiya
    Nov 25 '18 at 8:19











  • 'The applicable field' - if you mean logid why not say so?

    – P.Salmon
    Nov 25 '18 at 9:02
















0















I have a string of events being logged on a 5 minute basis throughout the day in a MySQL DB. I need to identify the first event (where logid > 0) of the day as well as the last (where logid=0), but struggling to find a simple SQL solution.



A 0 will be stored in the logid field in every row starting at midnight until the first event is triggered, at which point it will change to a number > 0. Then various events will be triggered logging a number > 0 for the remainder of the day, at which point the field will once again be logged as 0 until midnight, when the process starts over again.



Is there a quick and simple way to pull the rows identifying the time when the events start, and another result showing when the events end?



CREATE TABLE logs( 
id INT AUTO_INCREMENT,
date DATETIME,
logid INT,
PRIMARY KEY (id)
) ENGINE=INNODB;


This is the test data:



id  date                logid
1 2018-11-12 01:05:00 0
2 2018-11-12 01:10:00 0
3 2018-11-12 01:15:00 0
4 2018-11-12 01:20:00 0
5 2018-11-12 01:05:00 0

84 2018-11-12 06:35:00 0
85 2018-11-12 06:35:00 1
86 2018-11-12 06:40:00 1
87 2018-11-12 06:45:00 1
88 2018-11-12 06:50:00 1

164 2018-11-12 15:20:00 1
165 2018-11-12 15:25:00 0
166 2018-11-12 15:30:00 0
167 2018-11-12 15:35:00 0


Desired Result set:



85  2018-11-12 06:35:00 1   
165 2018-11-12 15:25:00 0


I'm not concerned about logid up until the first instance where it is greater than 0. But I need to identify the first instance where logid > 0, and then the next chronological instance where logid = 0 again.



My primary attempt was to group and order on the date and logid (edit: failed attempt removed for clarity)



Here's my latest attempt



       (SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date
limit 1
)UNION ALL(
SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date DESC
limit 1)


Getting closer, but not quite there. This gives me the correct first row where logid = 1, but it gives me the last row where logid = 1 (id 164) rather than the following row where logid = 0 (id=165).



Is it possible to select the penultimate row of a set if I change limit 1 to 2?
Any other pointers to keep me moving forward?










share|improve this question

























  • You should really show us some table data which explains the problem.

    – Tim Biegeleisen
    Nov 25 '18 at 6:37






  • 1





    Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

    – Madhur Bhaiya
    Nov 25 '18 at 6:40











  • You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

    – seand
    Nov 25 '18 at 7:25






  • 1





    Please add the corresponding expected output to the given sample data

    – Madhur Bhaiya
    Nov 25 '18 at 8:19











  • 'The applicable field' - if you mean logid why not say so?

    – P.Salmon
    Nov 25 '18 at 9:02














0












0








0








I have a string of events being logged on a 5 minute basis throughout the day in a MySQL DB. I need to identify the first event (where logid > 0) of the day as well as the last (where logid=0), but struggling to find a simple SQL solution.



A 0 will be stored in the logid field in every row starting at midnight until the first event is triggered, at which point it will change to a number > 0. Then various events will be triggered logging a number > 0 for the remainder of the day, at which point the field will once again be logged as 0 until midnight, when the process starts over again.



Is there a quick and simple way to pull the rows identifying the time when the events start, and another result showing when the events end?



CREATE TABLE logs( 
id INT AUTO_INCREMENT,
date DATETIME,
logid INT,
PRIMARY KEY (id)
) ENGINE=INNODB;


This is the test data:



id  date                logid
1 2018-11-12 01:05:00 0
2 2018-11-12 01:10:00 0
3 2018-11-12 01:15:00 0
4 2018-11-12 01:20:00 0
5 2018-11-12 01:05:00 0

84 2018-11-12 06:35:00 0
85 2018-11-12 06:35:00 1
86 2018-11-12 06:40:00 1
87 2018-11-12 06:45:00 1
88 2018-11-12 06:50:00 1

164 2018-11-12 15:20:00 1
165 2018-11-12 15:25:00 0
166 2018-11-12 15:30:00 0
167 2018-11-12 15:35:00 0


Desired Result set:



85  2018-11-12 06:35:00 1   
165 2018-11-12 15:25:00 0


I'm not concerned about logid up until the first instance where it is greater than 0. But I need to identify the first instance where logid > 0, and then the next chronological instance where logid = 0 again.



My primary attempt was to group and order on the date and logid (edit: failed attempt removed for clarity)



Here's my latest attempt



       (SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date
limit 1
)UNION ALL(
SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date DESC
limit 1)


Getting closer, but not quite there. This gives me the correct first row where logid = 1, but it gives me the last row where logid = 1 (id 164) rather than the following row where logid = 0 (id=165).



Is it possible to select the penultimate row of a set if I change limit 1 to 2?
Any other pointers to keep me moving forward?










share|improve this question
















I have a string of events being logged on a 5 minute basis throughout the day in a MySQL DB. I need to identify the first event (where logid > 0) of the day as well as the last (where logid=0), but struggling to find a simple SQL solution.



A 0 will be stored in the logid field in every row starting at midnight until the first event is triggered, at which point it will change to a number > 0. Then various events will be triggered logging a number > 0 for the remainder of the day, at which point the field will once again be logged as 0 until midnight, when the process starts over again.



Is there a quick and simple way to pull the rows identifying the time when the events start, and another result showing when the events end?



CREATE TABLE logs( 
id INT AUTO_INCREMENT,
date DATETIME,
logid INT,
PRIMARY KEY (id)
) ENGINE=INNODB;


This is the test data:



id  date                logid
1 2018-11-12 01:05:00 0
2 2018-11-12 01:10:00 0
3 2018-11-12 01:15:00 0
4 2018-11-12 01:20:00 0
5 2018-11-12 01:05:00 0

84 2018-11-12 06:35:00 0
85 2018-11-12 06:35:00 1
86 2018-11-12 06:40:00 1
87 2018-11-12 06:45:00 1
88 2018-11-12 06:50:00 1

164 2018-11-12 15:20:00 1
165 2018-11-12 15:25:00 0
166 2018-11-12 15:30:00 0
167 2018-11-12 15:35:00 0


Desired Result set:



85  2018-11-12 06:35:00 1   
165 2018-11-12 15:25:00 0


I'm not concerned about logid up until the first instance where it is greater than 0. But I need to identify the first instance where logid > 0, and then the next chronological instance where logid = 0 again.



My primary attempt was to group and order on the date and logid (edit: failed attempt removed for clarity)



Here's my latest attempt



       (SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date
limit 1
)UNION ALL(
SELECT *
FROM logs
WHERE logid>0
GROUP BY date
ORDER BY date DESC
limit 1)


Getting closer, but not quite there. This gives me the correct first row where logid = 1, but it gives me the last row where logid = 1 (id 164) rather than the following row where logid = 0 (id=165).



Is it possible to select the penultimate row of a set if I change limit 1 to 2?
Any other pointers to keep me moving forward?







mysql






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 28 '18 at 23:26







Jimmyb

















asked Nov 25 '18 at 6:34









JimmybJimmyb

5131414




5131414













  • You should really show us some table data which explains the problem.

    – Tim Biegeleisen
    Nov 25 '18 at 6:37






  • 1





    Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

    – Madhur Bhaiya
    Nov 25 '18 at 6:40











  • You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

    – seand
    Nov 25 '18 at 7:25






  • 1





    Please add the corresponding expected output to the given sample data

    – Madhur Bhaiya
    Nov 25 '18 at 8:19











  • 'The applicable field' - if you mean logid why not say so?

    – P.Salmon
    Nov 25 '18 at 9:02



















  • You should really show us some table data which explains the problem.

    – Tim Biegeleisen
    Nov 25 '18 at 6:37






  • 1





    Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

    – Madhur Bhaiya
    Nov 25 '18 at 6:40











  • You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

    – seand
    Nov 25 '18 at 7:25






  • 1





    Please add the corresponding expected output to the given sample data

    – Madhur Bhaiya
    Nov 25 '18 at 8:19











  • 'The applicable field' - if you mean logid why not say so?

    – P.Salmon
    Nov 25 '18 at 9:02

















You should really show us some table data which explains the problem.

– Tim Biegeleisen
Nov 25 '18 at 6:37





You should really show us some table data which explains the problem.

– Tim Biegeleisen
Nov 25 '18 at 6:37




1




1





Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

– Madhur Bhaiya
Nov 25 '18 at 6:40





Please put some efforts in framing a question with relevant and minimal sample data showcasing your requirements, and expected output. Please read this link: Why should I provide an MCVE for what seems to me to be a very simple SQL query?

– Madhur Bhaiya
Nov 25 '18 at 6:40













You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

– seand
Nov 25 '18 at 7:25





You'll get better responses if you structure your sql and data so it's easier to read. It's an arcane jumble.

– seand
Nov 25 '18 at 7:25




1




1





Please add the corresponding expected output to the given sample data

– Madhur Bhaiya
Nov 25 '18 at 8:19





Please add the corresponding expected output to the given sample data

– Madhur Bhaiya
Nov 25 '18 at 8:19













'The applicable field' - if you mean logid why not say so?

– P.Salmon
Nov 25 '18 at 9:02





'The applicable field' - if you mean logid why not say so?

– P.Salmon
Nov 25 '18 at 9:02












1 Answer
1






active

oldest

votes


















0














This question doesn't seem to be a problem for others, but I thought I would post the answer I came up with in case anyone runs into a similar situation in the future.



SET @v1 := (SELECT date 
FROM logs
WHERE logid > 0
GROUP BY date
ORDER BY date
limit 1);

(SELECT *
FROM logs
WHERE date>@v1 and logid>0
GROUP BY date
ORDER BY date
limit 1
) UNION ALL (
SELECT *
FROM logs
WHERE date>@v1 and logid=0
GROUP BY date
ORDER BY date
limit 1
)





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%2f53465235%2fmysql-locate-first-and-last-event-per-day%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














    This question doesn't seem to be a problem for others, but I thought I would post the answer I came up with in case anyone runs into a similar situation in the future.



    SET @v1 := (SELECT date 
    FROM logs
    WHERE logid > 0
    GROUP BY date
    ORDER BY date
    limit 1);

    (SELECT *
    FROM logs
    WHERE date>@v1 and logid>0
    GROUP BY date
    ORDER BY date
    limit 1
    ) UNION ALL (
    SELECT *
    FROM logs
    WHERE date>@v1 and logid=0
    GROUP BY date
    ORDER BY date
    limit 1
    )





    share|improve this answer




























      0














      This question doesn't seem to be a problem for others, but I thought I would post the answer I came up with in case anyone runs into a similar situation in the future.



      SET @v1 := (SELECT date 
      FROM logs
      WHERE logid > 0
      GROUP BY date
      ORDER BY date
      limit 1);

      (SELECT *
      FROM logs
      WHERE date>@v1 and logid>0
      GROUP BY date
      ORDER BY date
      limit 1
      ) UNION ALL (
      SELECT *
      FROM logs
      WHERE date>@v1 and logid=0
      GROUP BY date
      ORDER BY date
      limit 1
      )





      share|improve this answer


























        0












        0








        0







        This question doesn't seem to be a problem for others, but I thought I would post the answer I came up with in case anyone runs into a similar situation in the future.



        SET @v1 := (SELECT date 
        FROM logs
        WHERE logid > 0
        GROUP BY date
        ORDER BY date
        limit 1);

        (SELECT *
        FROM logs
        WHERE date>@v1 and logid>0
        GROUP BY date
        ORDER BY date
        limit 1
        ) UNION ALL (
        SELECT *
        FROM logs
        WHERE date>@v1 and logid=0
        GROUP BY date
        ORDER BY date
        limit 1
        )





        share|improve this answer













        This question doesn't seem to be a problem for others, but I thought I would post the answer I came up with in case anyone runs into a similar situation in the future.



        SET @v1 := (SELECT date 
        FROM logs
        WHERE logid > 0
        GROUP BY date
        ORDER BY date
        limit 1);

        (SELECT *
        FROM logs
        WHERE date>@v1 and logid>0
        GROUP BY date
        ORDER BY date
        limit 1
        ) UNION ALL (
        SELECT *
        FROM logs
        WHERE date>@v1 and logid=0
        GROUP BY date
        ORDER BY date
        limit 1
        )






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 29 '18 at 20:39









        JimmybJimmyb

        5131414




        5131414






























            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%2f53465235%2fmysql-locate-first-and-last-event-per-day%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

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

            Calculate evaluation metrics using cross_val_predict sklearn

            Insert data from modal to MySQL (multiple modal on website)