Formulate correlated subqueries (row-wise check of condition) in Snowflake SQL












0














I have two tables. The first table looks like this:



CompanyID  | TIMESTAMP           | NewsitemID 
---------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1
ID2 | 2000-01-06 15:32:00 | 2
ID1 | 2000-01-07 14:00:00 | 3
ID3 | 2000-01-07 17:00:00 | 4


Now I want to update the timestamp if it falls inbetween two consecutive Closingtimes given in the second table. The new timestamp should be the second of the two consecutive entries as indicated by the corresponding SelectedTimestamp. This is the second table:



Closingtime         | SelectedTimestamp 
-----------------------------------------
2000-01-05 16:00:00 | --
2000-01-06 16:00:00 | 2000-01-06 16:00:00
2000-01-07 16:00:00 | 2000-01-07 16:00:00
2000-01-10 16:00:00 | 2000-01-10 16:00:00


So, what I want to achieve is:



CompanyID  | TIMESTAMP           | NewsitemID | NewTimestamp
-------------------------------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00
ID2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00
ID1 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00
ID3 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00


But I am pretty new to Snowflake SQL and have problems even with starting the query. I have figured that I could probably use something in the direction of



SELECT SelectedTimestamp 
WHERE TIMESTAMP BETWEEN lower_bound AND upper_bound


but I have no clue how to "loop" through the lower and upper bounds given by the ClosingTime.



Any hint on how I could proceed here would be very much appreciated!










share|improve this question
























  • Your question could use some clarifications, see my comment.
    – Marcin Zukowski
    Nov 18 '18 at 8:08










  • Thanks, I hope it's clearer now!
    – Jeannine
    Nov 19 '18 at 20:36
















0














I have two tables. The first table looks like this:



CompanyID  | TIMESTAMP           | NewsitemID 
---------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1
ID2 | 2000-01-06 15:32:00 | 2
ID1 | 2000-01-07 14:00:00 | 3
ID3 | 2000-01-07 17:00:00 | 4


Now I want to update the timestamp if it falls inbetween two consecutive Closingtimes given in the second table. The new timestamp should be the second of the two consecutive entries as indicated by the corresponding SelectedTimestamp. This is the second table:



Closingtime         | SelectedTimestamp 
-----------------------------------------
2000-01-05 16:00:00 | --
2000-01-06 16:00:00 | 2000-01-06 16:00:00
2000-01-07 16:00:00 | 2000-01-07 16:00:00
2000-01-10 16:00:00 | 2000-01-10 16:00:00


So, what I want to achieve is:



CompanyID  | TIMESTAMP           | NewsitemID | NewTimestamp
-------------------------------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00
ID2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00
ID1 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00
ID3 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00


But I am pretty new to Snowflake SQL and have problems even with starting the query. I have figured that I could probably use something in the direction of



SELECT SelectedTimestamp 
WHERE TIMESTAMP BETWEEN lower_bound AND upper_bound


but I have no clue how to "loop" through the lower and upper bounds given by the ClosingTime.



Any hint on how I could proceed here would be very much appreciated!










share|improve this question
























  • Your question could use some clarifications, see my comment.
    – Marcin Zukowski
    Nov 18 '18 at 8:08










  • Thanks, I hope it's clearer now!
    – Jeannine
    Nov 19 '18 at 20:36














0












0








0







I have two tables. The first table looks like this:



CompanyID  | TIMESTAMP           | NewsitemID 
---------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1
ID2 | 2000-01-06 15:32:00 | 2
ID1 | 2000-01-07 14:00:00 | 3
ID3 | 2000-01-07 17:00:00 | 4


Now I want to update the timestamp if it falls inbetween two consecutive Closingtimes given in the second table. The new timestamp should be the second of the two consecutive entries as indicated by the corresponding SelectedTimestamp. This is the second table:



Closingtime         | SelectedTimestamp 
-----------------------------------------
2000-01-05 16:00:00 | --
2000-01-06 16:00:00 | 2000-01-06 16:00:00
2000-01-07 16:00:00 | 2000-01-07 16:00:00
2000-01-10 16:00:00 | 2000-01-10 16:00:00


So, what I want to achieve is:



CompanyID  | TIMESTAMP           | NewsitemID | NewTimestamp
-------------------------------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00
ID2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00
ID1 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00
ID3 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00


But I am pretty new to Snowflake SQL and have problems even with starting the query. I have figured that I could probably use something in the direction of



SELECT SelectedTimestamp 
WHERE TIMESTAMP BETWEEN lower_bound AND upper_bound


but I have no clue how to "loop" through the lower and upper bounds given by the ClosingTime.



Any hint on how I could proceed here would be very much appreciated!










share|improve this question















I have two tables. The first table looks like this:



CompanyID  | TIMESTAMP           | NewsitemID 
---------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1
ID2 | 2000-01-06 15:32:00 | 2
ID1 | 2000-01-07 14:00:00 | 3
ID3 | 2000-01-07 17:00:00 | 4


Now I want to update the timestamp if it falls inbetween two consecutive Closingtimes given in the second table. The new timestamp should be the second of the two consecutive entries as indicated by the corresponding SelectedTimestamp. This is the second table:



Closingtime         | SelectedTimestamp 
-----------------------------------------
2000-01-05 16:00:00 | --
2000-01-06 16:00:00 | 2000-01-06 16:00:00
2000-01-07 16:00:00 | 2000-01-07 16:00:00
2000-01-10 16:00:00 | 2000-01-10 16:00:00


So, what I want to achieve is:



CompanyID  | TIMESTAMP           | NewsitemID | NewTimestamp
-------------------------------------------------------------------
ID1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00
ID2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00
ID1 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00
ID3 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00


But I am pretty new to Snowflake SQL and have problems even with starting the query. I have figured that I could probably use something in the direction of



SELECT SelectedTimestamp 
WHERE TIMESTAMP BETWEEN lower_bound AND upper_bound


but I have no clue how to "loop" through the lower and upper bounds given by the ClosingTime.



Any hint on how I could proceed here would be very much appreciated!







sql correlated-subquery snowflake-datawarehouse






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 '18 at 20:34







Jeannine

















asked Nov 15 '18 at 16:44









JeannineJeannine

33




33












  • Your question could use some clarifications, see my comment.
    – Marcin Zukowski
    Nov 18 '18 at 8:08










  • Thanks, I hope it's clearer now!
    – Jeannine
    Nov 19 '18 at 20:36


















  • Your question could use some clarifications, see my comment.
    – Marcin Zukowski
    Nov 18 '18 at 8:08










  • Thanks, I hope it's clearer now!
    – Jeannine
    Nov 19 '18 at 20:36
















Your question could use some clarifications, see my comment.
– Marcin Zukowski
Nov 18 '18 at 8:08




Your question could use some clarifications, see my comment.
– Marcin Zukowski
Nov 18 '18 at 8:08












Thanks, I hope it's clearer now!
– Jeannine
Nov 19 '18 at 20:36




Thanks, I hope it's clearer now!
– Jeannine
Nov 19 '18 at 20:36












1 Answer
1






active

oldest

votes


















0














I'm not 100% sure what is the expected behavior you want, as the second table columns are identical.
Also, you didn't specify what "lower/upper bounds" mean for you, but I'll assume you mean two consecutive rows.



In either case, Snowflake actually has pretty rich support for subqueries. Hopefully this is what you need:



select first.*, 
(select min(selectedtimestamp)
from second where closingtime > first.timestamp) as newtimestamp
from first;
-----------+---------------------+------------+---------------------+
COMPANYID | TIMESTAMP | NEWSITEMID | NEWTIMESTAMP |
-----------+---------------------+------------+---------------------+
id1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00 |
id2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00 |
id3 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00 |
id4 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00 |
-----------+---------------------+------------+---------------------+





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%2f53324160%2fformulate-correlated-subqueries-row-wise-check-of-condition-in-snowflake-sql%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














    I'm not 100% sure what is the expected behavior you want, as the second table columns are identical.
    Also, you didn't specify what "lower/upper bounds" mean for you, but I'll assume you mean two consecutive rows.



    In either case, Snowflake actually has pretty rich support for subqueries. Hopefully this is what you need:



    select first.*, 
    (select min(selectedtimestamp)
    from second where closingtime > first.timestamp) as newtimestamp
    from first;
    -----------+---------------------+------------+---------------------+
    COMPANYID | TIMESTAMP | NEWSITEMID | NEWTIMESTAMP |
    -----------+---------------------+------------+---------------------+
    id1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00 |
    id2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00 |
    id3 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00 |
    id4 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00 |
    -----------+---------------------+------------+---------------------+





    share|improve this answer


























      0














      I'm not 100% sure what is the expected behavior you want, as the second table columns are identical.
      Also, you didn't specify what "lower/upper bounds" mean for you, but I'll assume you mean two consecutive rows.



      In either case, Snowflake actually has pretty rich support for subqueries. Hopefully this is what you need:



      select first.*, 
      (select min(selectedtimestamp)
      from second where closingtime > first.timestamp) as newtimestamp
      from first;
      -----------+---------------------+------------+---------------------+
      COMPANYID | TIMESTAMP | NEWSITEMID | NEWTIMESTAMP |
      -----------+---------------------+------------+---------------------+
      id1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00 |
      id2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00 |
      id3 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00 |
      id4 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00 |
      -----------+---------------------+------------+---------------------+





      share|improve this answer
























        0












        0








        0






        I'm not 100% sure what is the expected behavior you want, as the second table columns are identical.
        Also, you didn't specify what "lower/upper bounds" mean for you, but I'll assume you mean two consecutive rows.



        In either case, Snowflake actually has pretty rich support for subqueries. Hopefully this is what you need:



        select first.*, 
        (select min(selectedtimestamp)
        from second where closingtime > first.timestamp) as newtimestamp
        from first;
        -----------+---------------------+------------+---------------------+
        COMPANYID | TIMESTAMP | NEWSITEMID | NEWTIMESTAMP |
        -----------+---------------------+------------+---------------------+
        id1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00 |
        id2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00 |
        id3 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00 |
        id4 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00 |
        -----------+---------------------+------------+---------------------+





        share|improve this answer












        I'm not 100% sure what is the expected behavior you want, as the second table columns are identical.
        Also, you didn't specify what "lower/upper bounds" mean for you, but I'll assume you mean two consecutive rows.



        In either case, Snowflake actually has pretty rich support for subqueries. Hopefully this is what you need:



        select first.*, 
        (select min(selectedtimestamp)
        from second where closingtime > first.timestamp) as newtimestamp
        from first;
        -----------+---------------------+------------+---------------------+
        COMPANYID | TIMESTAMP | NEWSITEMID | NEWTIMESTAMP |
        -----------+---------------------+------------+---------------------+
        id1 | 2000-01-06 15:00:00 | 1 | 2000-01-06 16:00:00 |
        id2 | 2000-01-06 15:32:00 | 2 | 2000-01-06 16:00:00 |
        id3 | 2000-01-07 14:00:00 | 3 | 2000-01-07 16:00:00 |
        id4 | 2000-01-07 17:00:00 | 4 | 2000-01-10 16:00:00 |
        -----------+---------------------+------------+---------------------+






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 18 '18 at 8:07









        Marcin ZukowskiMarcin Zukowski

        1,8701819




        1,8701819






























            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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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%2f53324160%2fformulate-correlated-subqueries-row-wise-check-of-condition-in-snowflake-sql%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

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?