{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"cssClassNames":"page basicpage summit-page","language":"en","description":"Getting Started with Time Series Analytics for IoT in Snowflake","title":"Getting Started with Time Series Analytics for IoT in Snowflake","templateName":"quickstart-page-template","analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,"isPasswordProtected":false,"analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/applications-and-collaboration","snowflake-site:taxonomy/snowflake-feature/time-series-functions","snowflake-site:taxonomy/product/data-engineering"],"analyticsEnabled":true,"coveoConfig":{"organizationId":"snowflakecomputingproduction8neljofn","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","pipeline":"snowflake.com","searchHub":"snowflake.com"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks","language":"en","category":"general","pageName":"Getting Started with Time Series Analytics for IoT in Snowflake","contentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/applications-and-collaboration","snowflake-site:taxonomy/snowflake-feature/time-series-functions","snowflake-site:taxonomy/product/data-engineering"]},":mappedPath":"/en/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/",":type":"snowflake-site/components/structure/page",":items":{"root":{"columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-5d2b23e73b","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-1d2c9fb2b1",":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-47d9439b83","contentHeadline":"Snowflake World Tour hits your city","contentDescription":"See how leading teams deploy agents at scale. Find a stop near you. Register free.","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"/en/world-tour/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Register now"},":type":"snowflake-site/components/pushdown-banner","appliedCssClassNames":"snowflake-pushdown-banner-text-white snowflake-pushdown-banner-background-black"}},":itemsOrder":["pushdown_banner_copy"]},"image":{":type":"nt:unstructured"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:metadata"],"classNames":"aem-xf"},"experiencefragment-header":{"id":"experiencefragment-3a5c5a164b","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-d32c3ffe15",":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-1b38939cdc","title":" ","cssContent":".footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.mega-nav__sign-in.snowflake-button-container{display:none}@media screen and (min-width:768px){.mega-nav__sign-in.snowflake-button-container{display:inline-block;font-family:'Texta',sans-serif;font-weight:800 !important}}@media screen and (min-width:1024px) and (max-width:1199px){.snowflake-mega-nav-header-buttons-container .snowflake-button-blue .snowflake-button-container{font-size:13px !important}.snowflake-language-navigation .language-icon{width:18px !important;height:18px !important;margin-right:4px !important}}.mega-nav__sign-in svg{display:none}.nav-item__platform-parent-why-sf.snowflake-mega-nav-nav-item\u003Ea:hover,.nav-item__platform-parent.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent !important}.nav-platform-sidebar .snowflake-mega-nav-nav-item:hover.blue-icon .snowflake-mega-nav-nav-item-icon__inner{background-color:var(--ui-01) !important}@media screen and (min-width:1024px){.snowflake-mega-nav-navigation-dropdown{overflow:hidden}.meganav-platform-features{padding-left:64px}.meganav-platform-features::before{content:'';transform:translateX(-64px);display:block;z-index:0;width:100%;height:100%;position:absolute;top:0;background:#f7f9fa}.nav-item--si.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent}.nav-item--si{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:8px}.nav-item__platform-parent{border-bottom:1px solid #ccc;margin-bottom:8px;padding-bottom:16px}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description::after{content:'What Snowflake can do for you \u003E';display:block;color:var(--ui-01);margin-top:16px}.nav-item__platform-parent .snowflake-mega-nav-nav-item-description::after{content:'View the platform \u003E';display:block;color:var(--ui-01);margin-top:16px}}@media screen and (min-width:1367px){.snowflake-mega-nav-nav-item-description{font-size:13px !important;line-height:20px !important}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{font-size:17px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-title,.nav-item__platform-parent .snowflake-mega-nav-nav-item-title{font-size:24px !important;line-height:32px !important;margin-bottom:8px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description,.nav-item__platform-parent .snowflake-mega-nav-nav-item-description{font-size:14px !important;line-height:20px !important}}html.wf-texta-n9-loading .display-1-v2{font-size:48px!important;line-height:50px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-4-v2{font-size:18px!important;line-height:24px!important;font-family:sans-serif!important}@media screen and (min-width:768px){html.wf-texta-n9-loading .display-2-v2{font-size:48px!important;line-height:50px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:55.5px!important;line-height:54px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .heading-5-v2,html.wf-lato-n4-loading .snowflake-card-v2-advanced-text .snowflake-text p{font-size:15.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:34px!important;line-height:38px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-4,html.wf-texta-n8-loading .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-regular .snowflake-button-container{font-size:13px!important;line-height:20px!important;letter-spacing:.25px!important;font-family:sans-serif!important}}@media screen and (min-width:1024px){html.wf-lato-n4-loading .snowflake-mega-nav-nav-item-description{font-size:11.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .snowflake-button-compact .snowflake-button-container{font-size:12px!important;letter-spacing:0!important;line-height:18px!important}}@media screen and (min-width:1367px){html.wf-lato-n4-loading .hp-hero__eyebrow a\u003Eb:first-child{font-size:11px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .hp-hero__eyebrow a{font-size:13px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-2-v2{font-size:61px!important;line-height:60px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:74.5px!important;line-height:74px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:41px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-3-v2{font-family:sans-serif!important;letter-spacing:-.75px!important;font-size:33.75px!important}html.wf-texta-n9-loading .heading-4-v2{font-size:19.5px!important;line-height:26px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2{font-size:12px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:14px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-1,html.wf-lato-n4-loading .cq-Editable-dom[data-cq-data-path*=text] ol\u003Eli,html.wf-lato-n4-loading .snowflake-text li,html.wf-lato-n4-loading .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text li,html.wf-lato-n4-loading .text-size-large .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-large.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom span[data-testid=text-content],html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Ep,html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Eul\u003Eli{font-size:17.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content],html.wf-texta-n8-loading .snowflake-button-link .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-link-back .snowflake-button-container{font-size:15.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-3,html.wf-lato-n4-loading .text-size-small .snowflake-text li,html.wf-lato-n4-loading .text-size-small .snowflake-text p,html.wf-lato-n4-loading .text-size-small .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-small.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}}#industryPlatformSection,.sc-hero{background-position:top left;background-size:20% auto}.bwalignc,.bwalignr{list-style-position:inside}.snowflake-text p sup{font-size:10px}#industryPlatformSection .industry-platform__row .snowflake-flexible-column-container-items,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container,.snowflake-hero-system-content-container{gap:16px}.agenda-item p,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.partner-details p{margin:0!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::after,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::before,.hide-logo .snowflake-case-study-card-logo,.partner-page__powered-by-logo,.sc-hero div.code-toolbar\u003E.toolbar,.snowflake-card-v2-advanced.no-link .snowflake-card-v2-advanced-button,.snowflake-partner-hero-card-badge-container{display:none!important}.section--card-mobile-carousel .snowflake-flexible-column-container-items-with-carousel{max-width:100%!important}@media screen and (min-width:768px){.button-group-pair .snowflake-button-container.inline-button--desktop,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;display:inline-block!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:flex-start!important}.button-group-pair.center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center!important}.section--card-mobile-carousel{margin-left:var(--tablet-portrait-margin,48px)!important;margin-right:var(--tablet-portrait-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-portrait-margin) * 2)!important}}@media screen and (min-width:1024px){.section--card-mobile-carousel{margin-left:var(--tablet-horizontal-margin,48px)!important;margin-right:var(--tablet-horizontal-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-horizontal-margin) * 2)!important}.snowflake-mega-nav-header-mobile-icon{display:none!important}}@media screen and (min-width:1367px){.section--card-mobile-carousel{margin-left:var(--desktop-margin,6.5%)!important;margin-right:var(--desktop-margin,6.5%);width:87%!important;width:calc(100% - var(--desktop-margin) * 2)!important}.logo-container{min-width:143px}.sc-hero__headline .heading-1-v2{font-size:60px}.snowflake-mega-nav-navigation-title{font-size:17px}.snowflake-mega-nav-dropdown-footer-wrapper .snowflake-title-v2 .snowflake-title-v2-line:first-child{font-size:16px!important;line-height:24px!important}}.hero--home{overflow:hidden;background-color:var(--ui-01);z-index:2}.hp-hero__subheadline{width:90%}.hero--home .snowflake-button-container{transition:.3s}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-secondary a:hover,.hero--home .snowflake-button-white a:hover{transition:.3s;background-color:var(--ui-02)!important;color:var(--ui-05)!important}.hero--home .snowflake-button-secondary a:hover{border-color:var(--ui-05)!important}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-white a:hover{border-color:var(--ui-02)!important}.bwalignc,.hp-hero__eyebrow{text-align:center}.hp-hero__eyebrow a{display:inline-flex;flex-direction:column;justify-content:center;cursor:pointer;padding:8px;border-radius:var(--spacing-01);gap:8px;align-items:center;background-color:#45aee3;color:var(--ui-03);font-family:Texta,sans-serif;font-weight:800;font-size:16px;line-height:22px;transition:background-color .3s}.hp-hero__eyebrow a:hover{background-color:#7fc6ea;text-decoration:none;transition:background-color .3s}.hp-hero__eyebrow a\u003Eb:first-child{text-transform:uppercase;white-space:nowrap;display:inline-block;background-color:var(--ui-02);color:var(--ui-05);font-size:12px!important;line-height:16px!important;font-family:Lato,sans-serif;font-weight:500!important;padding:3px 6px;border-radius:2px;letter-spacing:1px}@media screen and (min-width:767px){.hp-hero__eyebrow{text-align:left}.hp-hero__eyebrow a{flex-direction:row;text-align:left}}.hero--home__inner .offset-video,.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{max-height:200px;overflow:hidden}.hero--home__inner .offset-video .wistia-responsive-padding{padding-top:100%}.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{position:absolute!important;top:0;left:0;width:100%}.offset-video__bg-image{z-index:-1}@media screen and (min-width:768px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{position:absolute!important;max-height:none;top:0;left:0;width:250%;padding-bottom:250%;transform:translate(0,-50%);height:0}.workloads_7.unistore{max-width:317px}}.promo-banner--homepage{z-index:2}.homepage-banner-offset-container::after{content:\"\";display:block;position:absolute;bottom:0;z-index:1;left:0;width:100%;height:80%;background:#fff}.section--quicklinks .snowflake-button-full-width a{padding-left:24px!important;padding-right:24px!important;transition:box-shadow .25s cubic-bezier(.4,0,.2,1);text-align:left;display:flex;justify-content:center;align-items:center}.section--quicklinks .snowflake-button-full-width a:hover{box-shadow:0 16px 16px 0 rgb(0 0 0 / .16);transition:box-shadow .25s cubic-bezier(.4,0,.2,1)}.section--quicklinks .snowflake-button-container:focus-visible a::before,.section--quicklinks .snowflake-button-full-width a::before{content:\"\";width:23px;height:23px;flex-shrink:0;margin-right:12px;display:inline-block;background-size:cover;background-repeat:no-repeat;background-position:center}#industryPartnerSlider .snowflake-navigation-icon.swiper-button-disabled,#partnerResources .section--resource-hub a svg,.button-tabs span.snowflake-tabs-navigation-item:after,.customer-card--hide-cta .snowflake-case-study-card-button,.dot-tabs span.snowflake-tabs-navigation-item::after,.partner-sidebar__mobile-expand,html:not(.aem-AuthorLayer-initial):not(.aem-AuthorLayer-Edit) .tab-content:not(.is-active){display:none}.section--quicklinks .snowflake-button-full-width a.pricing::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/decorative-icons/pricing-icon.svg)}.section--quicklinks .snowflake-button-full-width a.snowflake_on_snowflake::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon_snowflake-bug.svg)}.section--quicklinks .snowflake-button-full-width a.virtual_hands_on_labs::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__training.svg)}.section--quicklinks .snowflake-button-full-width a.weekly_demo::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__webinars.svg)}@media screen and (min-width:1024px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{left:-50%}.section--quicklinks .snowflake-flexible-column-container-items{gap:24px}.snowflake-quote-item-inner{padding:32px 24px 24px!important}}#communitiesOuter_overflowBottomGray::after{max-height:100px}#caseStudyOuter_overflowBottomMidBlue::after{max-height:180px}#caseStudyInner .snowflake-case-study-card .snowflake-wistia-video{border-radius:0!important}#caseStudyInner .snowflake-case-study-card{box-shadow:none!important;border-radius:0}#caseStudyInner{max-width:1200px;margin:0 auto;box-shadow:rgb(152 162 179 / .1) 0 10px 20px 0,rgb(152 162 179 / .25) 0 2px 6px 0;border-radius:8px;overflow:hidden;position:relative;z-index:1}.case-study__logo-bar\u003E.snowflake-flexible-column-container-items{background:#f7f9fa;padding:32px 16px 40px}.case-study__logo-bar .cmp-image__image{width:90%;margin:0 auto;max-width:240px}.hp-platform__text-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child),.sc-sidebar__group .snowflake-button-link{margin-top:8px}.workloads_7.unistore{margin-left:auto;margin-right:auto}#homepageFootnotesInner .snowflake-simple-stat-disclaimer .snowflake-text p{color:#fff!important}.snowflake-simple-stat-disclaimer .snowflake-text p\u003Ea{border-bottom:1px solid var(--ui-03);color:var(--text-03)}.snowflake-card-v2-advanced{color:inherit}#workloadCardGridOuter .snowflake-card-v2-base-front{gap:0}.video-modal.snowflake-modal-window-open-inner{background-color:#fff0;padding:8px;border:none}.snowflake-container-arrow-dotted-faded .snowflake-container-arrow-dotted-faded-image{width:40%!important;max-width:420px;top:4%!important}.list--blue-bullets ul{margin:0!important;padding:0!important;list-style-type:none}.list--blue-bullets li{margin:0;padding:0 0 0 32px;position:relative}.list--blue-bullets li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.list--blue-bullets li:not(:last-child){margin-bottom:1rem}.logo-tabs .snowflake-navigation-container,.snowflake-simple-stat-content:empty,.summit-speaker-card .snowflake-card-v2-advanced-text{margin-bottom:0}#techResourceInner,#techResourceOuter,div.overflow-bottom--blue,div.overflow-bottom--gray,div.overflow-bottom--mid-blue,div.overflow-bottom--white,div.overflow-top--blue,div.overflow-top--gray,div.overflow-top--mid-blue,div.overflow-top--white,div[id$=overflowBottomGray],div[id$=overflowBottomMidBlue],div[id$=overflowTopBlue],div[id$=overflowTopGray]{position:relative}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{content:\"\";display:block;position:absolute;left:0;width:100%;height:40%}div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{top:0}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after{bottom:0}div.overflow-bottom--white::after,div.overflow-top--white::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopWhite]::after{background:#fff!important}div.overflow-bottom--gray::after,div.overflow-top--gray::after,div[id$=overflowBottomGray]::after,div[id$=overflowTopGray]::after{background:#f6f9fa!important}div.overflow-bottom--mid-blue::after,div.overflow-top--mid-blue::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowTopMidBlue]::after{background:#11567f!important}div.overflow-bottom--blue::after,div.overflow-top--blue::after,div[id$=overflowBottomBlue]::after,div[id$=overflowTopBlue]::after{background:#259edc!important}.snowflake-premium-content-banner.promo-banner--no-shadow{box-shadow:none!important}#industryPartnerSlider .cmp-image__image,#industryPartnerSlider .section--partner-tabs .snowflake-image-container .cmp-image__image,#partnerSidebar,.has-shadow .cmp-image__image{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25)}.content-chip--has-desc{align-items:flex-start;padding:20px!important}.content-chip--has-desc .snowflake-content-chip-image{max-width:100px}.content-chip--has-desc .snowflake-content-chip-image__image{aspect-ratio:1}.content-chip--has-desc .snowflake-title-v2-line:first-child{font-size:18px!important}.content-chip--has-desc .snowflake-title-v2-line:nth-child(2){color:#000!important;font-weight:500!important;font-size:16px!important;line-height:22px!important;margin-top:2px!important}.content-chip--has-desc .snowflake-content-chip-button{margin-top:6px!important;font-size:18px!important;display:none}.square-image .snowflake-content-chip-image{aspect-ratio:1;max-width:120px}.section--logo-bar.smaller-logos .snowflake-image-container .cmp-image__image{max-width:200px;margin:0 auto}.snowflake-card-v2-advanced-tag,.snowflake-content-chip-tag{padding:3px 6px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-button,.snowflake-card-v2-advanced-title:first-child,.summit-pricing-block__aside ul{margin-top:0}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:40px;height:40px;display:flex;justify-content:center;align-items:center;margin:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{width:12px;height:12px;background:var(--ui-12);border-radius:100%}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p,.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{font-size:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{background:var(--ui-01)}.button-tabs .snowflake-navigation-container .swiper-wrapper{padding:8px 0}.button-tabs .snowflake-navigation-container .swiper-slide{margin:0 6px}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{padding:8px 24px;background-color:#f6f9fa;border-radius:48px;margin:0}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{text-transform:uppercase;font-family:Texta,sans-serif;font-weight:700}.button-tabs .border-top{border-top:1px solid #ccc}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{background-color:var(--ui-01);box-shadow:0 2px 6px 0 rgb(152 162 179 / .25),0 10px 20px 0 rgb(152 162 179 / .1)}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{color:#fff}.button-tabs.has-icons .snowflake-navigation-container .snowflake-tabs-navigation-item p::before{content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-right:12px;vertical-align:middle;margin-top:-3px}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:220px;padding-bottom:50%;height:0;margin:0 8px!important;background-size:cover;background-repeat:no-repeat;opacity:.5;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item:hover{opacity:.75;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{opacity:1;transition:opacity .3s}.dot-tabs .aem-container.cmp-tabs,.logo-tabs .aem-container.cmp-tabs{display:flex;flex-direction:column-reverse}.snowflake-icon.is-center{margin:0 auto;display:block}#industryPartnerSlider .snowflake-flexible-column-container-items,#partnerLogoSquare .snowflake-flexible-column-container-items{gap:24px}#techResourceOuter::after{content:\"\";display:block;position:absolute;top:0;left:0;width:100%;height:40%;background:#f6f9fa}#techResourceInner{z-index:1}.partner-tier-tag h6{display:inline-block!important;padding:2px 6px;border-radius:2px;color:#666}.partner-tier-tag.registered h6{background-color:#f6f9fa}.partner-tier-tag.elite h6{background-color:#11567f;color:#fff}.partner-tier-tag.premier h6{background-color:#b14c77;color:#fff}.partner-tier-tag.select h6{background-color:#5094a0;color:#fff}.partner-details\u003Espan{display:flex;gap:24px}.partner-details a{color:inherit!important;font-weight:400!important}.partner-details p::before{content:\"\";display:inline-block;vertical-align:middle;width:16px;height:16px;background-repeat:no-repeat;background-position:center;transform:translateY(-1px);background-size:auto 90%;margin-right:6px}.partner-details__location::before{background-image:url(\"data:image/svg+xml,%3Csvg width='13' height='18' viewBox='0 0 13 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.25 17.7531C6.4375 17.7531 6.6 17.6844 6.7375 17.5531C6.875 17.4219 6.95 17.2531 6.95 17.0531C6.95 16.8531 7.075 16.4281 7.3 15.7969C7.5875 15.0281 7.925 14.3156 8.30625 13.6406C8.8 12.7781 9.3125 12.1031 9.85 11.6094C10.75 10.7969 11.4125 9.96563 11.85 9.12188C12.2875 8.27813 12.5063 7.40313 12.5063 6.49063C12.5063 5.36563 12.2187 4.31563 11.6437 3.33438C11.0937 2.40313 10.3438 1.65938 9.4 1.10938C8.43125 .534376 7.375 .246876 6.24375 .246876C5.1125 .246876 4.06875 .534376 3.0875 1.10938C2.15625 1.65938 1.4125 2.40313 .862498 3.33438C.287498 4.31563 0 5.36563 0 6.49063C0 7.47188 .262499 8.42813 .787499 9.35938C1.14375 10.0031 1.65625 10.6656 2.3125 11.3344C2.75625 11.8031 3.24375 12.4781 3.78125 13.3656C4.225 14.0969 4.63125 14.8594 5 15.6656C5.35 16.3844 5.53125 16.8531 5.55625 17.0656C5.55625 17.2594 5.625 17.4156 5.7625 17.5531C5.9 17.6844 6.0625 17.7531 6.25 17.7531ZM6.16875 14.9156C5.775 14.0656 5.325 13.2469 4.825 12.4594C4.275 11.5594 3.7625 10.8719 3.28125 10.3969C2.625 9.71563 2.1375 9.05938 1.825 8.43438C1.5125 7.80313 1.35625 7.16563 1.35625 6.50313C1.35625 5.61563 1.575 4.80313 2.0125 4.05313C2.45 3.30313 3.04375 2.71563 3.7875 2.27813C4.5375 1.84063 5.35 1.62188 6.2375 1.62188C7.125 1.62188 7.9375 1.84063 8.6875 2.27813C9.4375 2.71563 10.0312 3.30313 10.475 4.04688C10.9187 4.80313 11.1375 5.62188 11.1375 6.50313C11.1375 7.90313 10.3937 9.26563 8.9125 10.5969C8.35 11.1094 7.8125 11.7906 7.3 12.6406C6.88125 13.3344 6.50625 14.0969 6.16875 14.9219V14.9156ZM6.26875 8.36563C6.65625 8.36563 7.01875 8.26563 7.35625 8.07188C7.69375 7.87813 7.95625 7.60938 8.14375 7.28438C8.3375 6.95313 8.43125 6.59063 8.43125 6.19688C8.43125 5.80313 8.33125 5.43438 8.1375 5.10313C7.9375 4.76563 7.675 4.50313 7.3375 4.31563C7 4.12813 6.6375 4.02813 6.24375 4.02813C5.85 4.02813 5.4875 4.12813 5.15625 4.32188C4.825 4.52188 4.56875 4.78438 4.375 5.12188C4.18125 5.45938 4.0875 5.82188 4.0875 6.20938C4.0875 6.59688 4.1875 6.95938 4.38125 7.29688C4.58125 7.63438 4.84375 7.89688 5.18125 8.08438C5.51875 8.27813 5.88125 8.37188 6.26875 8.37188V8.36563ZM6.24375 7.50313C5.8875 7.50313 5.575 7.37188 5.31875 7.11563C5.0625 6.85938 4.93125 6.55313 4.93125 6.19063C4.93125 5.82813 5.0625 5.52188 5.31875 5.26563C5.575 5.00938 5.88125 4.87813 6.24375 4.87813C6.60625 4.87813 6.9125 5.00938 7.16875 5.26563C7.425 5.52188 7.55625 5.82813 7.55625 6.19063C7.55625 6.55313 7.425 6.85938 7.16875 7.11563C6.9125 7.37188 6.60625 7.50313 6.24375 7.50313Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}.partner-details__website::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.61587 2.96889C2.61587 2.75109 2.79633 2.57062 3.01413 2.57062C3.23192 2.57062 3.41238 2.75109 3.41238 2.96889C3.41238 3.18669 3.23192 3.36716 3.01413 3.36716C2.79633 3.36716 2.61587 3.18669 2.61587 2.96889ZM4.21512 2.96889C4.21512 2.75109 4.39558 2.57062 4.61338 2.57062C4.83117 2.57062 5.01163 2.75109 5.01163 2.96889C5.01163 3.18669 4.83117 3.36716 4.61338 3.36716C4.39558 3.36716 4.21512 3.18669 4.21512 2.96889ZM5.81438 2.96889C5.81438 2.75109 5.99484 2.57062 6.21264 2.57062C6.43043 2.57062 6.61089 2.75109 6.61089 2.96889C6.61089 3.18669 6.43043 3.36716 6.21264 3.36716C5.99484 3.36716 5.81438 3.18669 5.81438 2.96889ZM17.2518 .697559H1.19085C.811258 .697559 .506348 1.0025 .506348 1.38209V14.6179C.506348 14.9975 .811258 15.3024 1.19085 15.3024H17.2518C17.6314 15.3024 17.9363 14.9975 17.9363 14.6179V1.38209C17.9363 1.0025 17.6314 .697559 17.2518 .697559ZM16.5673 2.06035V3.90853H1.86914V2.06035H16.5673ZM1.86914 13.9334V4.78593H16.5673V13.9334H1.86914Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}#partnerSidebar{border-radius:4px;background-color:#fff;padding:24px 24px 32px;border-bottom:6px solid #29b5e8}#partnerSidebar h5,.newsletter-disclaimer p{font-size:14px!important}#partnerSidebar ul{margin-top:0;list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px}#partnerSidebar li{border:1px solid;border-radius:2px;padding:0 4px!important;font-size:11px!important;letter-spacing:.25px;text-transform:uppercase}div.snowflake-partner-hero-card{width:100%;margin:0}.partner-details__logo{max-width:380px;margin:0 auto}@media screen and (max-width:767px){.left-alignment .hp-hero__subheadline{margin-left:auto;margin-right:auto}.left-alignment .hp-hero__headline .snowflake-title-v2-line,.left-alignment .hp-hero__subheadline .snowflake-title-v2-line{text-align:center}.hero--home__inner .snowflake-flexible-column-container-items-top-padding-large{padding-top:var(--spacing-02)}.section--logo-bar\u003E.snowflake-flexible-column-container-items{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:center;gap:8px}.section--logo-bar\u003E.snowflake-flexible-column-container-items\u003Ediv{width:calc(33.33% - 8px)}.partner-sidebar__mobile-expand{display:inline-block;color:#249edc;border-color:#249edc!important}#partnerSidebar li:nth-child(n+6),.summit-nav__links .snowflake-button-tertiary{display:none}.sc-body__sidebar{background-color:#f6f9fa;padding:24px}.sc-body__content{padding:0 24px 24px}.summit-speaker-card .snowflake-card-v2-advanced-content{padding:24px}}#partnerResources h6,.snowflake-tabs-navigation-item p.body-1{font-size:16px!important}#partnerResources .section--resource-hub{padding:0 16px}#partnerResources .section--resource-hub a,.bwalignl{text-align:left}@media screen and (max-width:1023px){.hero--workload .snowflake-hero-system-media-container{width:100%}}.section--timely-content .snowflake-content-chip,.snowflake-mega-nav-dropdown-footer-wrapper{align-items:center}.section--timely-content .snowflake-content-chip-image{max-width:94px}.section--timely-content .snowflake-content-chip-image__inner{line-height:0}.section--timely-content .snowflake-content-chip-image__image{aspect-ratio:1;height:auto}.section--workload-overview .workload-overview__headline{max-width:280px;margin:0 auto}#industryPartnerSlider .swiper-slide{margin-top:0!important;padding:0 12px}#industryPartnerSlider .snowflake-tabs-navigation-item{margin-left:0!important;margin-right:0!important}#industryPartnerSlider .snowflake-premium-content-banner-background-grad-white .snowflake-premium-content-banner{box-shadow:none}#industryPartnerSlider .logo-slider__slide .aem-container{display:flex;padding:0 8px!important;flex-wrap:wrap;gap:16px!important;justify-content:center}#industryPartnerSlider .logo-slider__slide .aem-container\u003Ediv{width:48%;max-width:200px}#useCaseTabs{padding-top:24px;padding-bottom:24px;padding-right:24px}#useCaseTabs .tab-content.is-active{display:block}#useCaseTabs .vert-tab{border-bottom:1px solid #a0bbcc;padding-bottom:16px}#useCaseTabs .vert-tab p{display:inline-block}#useCaseTabs .vert-tab p:hover{cursor:pointer}#useCaseTabs .vert-tab p,#useCaseTabs .vert-tab.is-active p.not-active{color:#249edc}#useCaseTabs .vert-tab p.is-active,#useCaseTabs .vert-tab.is-active p{color:#000}#industryPlatformSection{background-image:url(/adobe/dynamicmedia/deliver/dm-aid--db074ad5-7122-4c51-87a3-76c3aa466182/double-arrow-bg%403x.png);background-repeat:no-repeat}.snowflake-text p.featured-quote__source{font-weight:900!important;text-transform:uppercase;font-size:16px!important;margin-top:2rem!important}.snowflake-text p.featured-quote__title{margin-top:0!important;font-size:16px!important}.snowflake-case-study-card-logo img{width:auto!important;height:100px!important;transform:translateX(-15%)}.snowflake-quote-item-quote-text{font-weight:600!important}#customerStoryStatsInner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row}#customerStoryStat1,#customerStoryStat2{max-width:240px}#storyHighlights{border-radius:4px;padding:1rem}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line,.summit-pricing-block__tile .black-blue-text-color .snowflake-title-v2-line{color:#000!important}.snowflake-youtube-embedded-wrapper{border-radius:var(--small-border-radius)}#arcticNavItem::before,#offset::before,#open-source::before{color:var(--text-05);font-family:Texta,sans-serif!important}#offset,.sc-architecture-caption{margin-top:16px}.hero--press .snowflake-title-v2-line{text-transform:none!important}@media screen and (min-width:768px){.subpage-timely-content__inner\u003E.snowflake-flexible-column-container-items{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25);padding:var(--spacing-04);border-radius:4px;overflow:hidden}#partnerLogoSquare{padding:0 0 0 48px}.hero--workload .snowflake-container{max-width:1440px;margin:0 auto!important;align-items:center}#industryPartnerSlider.snowflake-flexible-column-container-2-column-40-60\u003E.snowflake-flexible-column-container-items{grid-template-columns:minmax(40%,4fr) minmax(0,6fr)}#industryPartnerSlider .swiper-slide{padding:0 24px}.sc-body{padding:48px}.sc-body\u003E.snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:124px}}.snowflake-button-container.has-icon{display:inline-flex;justify-content:center;align-items:center;text-align:left}.snowflake-button-container.has-icon::before{content:\"\";display:inline-block;width:20px;height:20px;margin-right:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.snowflake-button-container.is-video::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1.28663C13.2523 1.28663 16.7134 4.74768 16.7134 9C16.7134 13.2523 13.2523 16.7134 9 16.7134C4.74768 16.7198 1.28663 13.2588 1.28663 9C1.28663 4.74124 4.74768 1.28663 9 1.28663ZM9 0C4.0336 0 0 4.0336 0 9C0 13.9664 4.0336 18 9 18C13.9728 18 18 13.9664 18 9C18 4.0336 13.9728 0 9 0Z' fill='white'/%3E%3Cpath d='M7.75106 6.18211C7.42941 6.16925 7.16565 6.42658 7.16565 6.74823V11.2772C7.16565 11.7082 7.65457 11.9848 8.02126 11.7597L11.7975 9.4952C12.1578 9.27647 12.1578 8.74252 11.7975 8.52379L8.02126 6.25931C7.93763 6.21428 7.84756 6.18211 7.75106 6.18211Z' fill='white'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-github::before{background-image:url(\"data:image/svg+xml,%3Csvg width='20' height='21' viewBox='0 0 20 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 .651794C4.475 .651794 0 5.12679 0 10.6518C0 15.0768 2.8625 18.8143 6.8375 20.1393C7.3375 20.2268 7.525 19.9268 7.525 19.6643C7.525 19.4268 7.5125 18.6393 7.5125 17.8018C5 18.2643 4.35 17.1893 4.15 16.6268C4.0375 16.3393 3.55 15.4518 3.125 15.2143C2.775 15.0268 2.275 14.5643 3.1125 14.5518C3.9 14.5393 4.4625 15.2768 4.65 15.5768C5.55 17.0893 6.9875 16.6643 7.5625 16.4018C7.65 15.7518 7.9125 15.3143 8.2 15.0643C5.975 14.8143 3.65 13.9518 3.65 10.1268C3.65 9.03929 4.0375 8.13929 4.675 7.43929C4.575 7.18929 4.225 6.16429 4.775 4.78929C4.775 4.78929 5.6125 4.52679 7.525 5.81429C8.325 5.58929 9.175 5.47679 10.025 5.47679C10.875 5.47679 11.725 5.58929 12.525 5.81429C14.4375 4.51429 15.275 4.78929 15.275 4.78929C15.825 6.16429 15.475 7.18929 15.375 7.43929C16.0125 8.13929 16.4 9.02679 16.4 10.1268C16.4 13.9643 14.0625 14.8143 11.8375 15.0643C12.2 15.3768 12.5125 15.9768 12.5125 16.9143C12.5125 18.2518 12.5 19.3268 12.5 19.6643C12.5 19.9268 12.6875 20.2393 13.1875 20.1393C17.1375 18.8143 20 15.0643 20 10.6518C20 5.12679 15.525 .651794 10 .651794Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-quickstart::before{background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='21' viewBox='0 0 15 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8489 2.79368H11.6439V2.38493C11.6439 1.71368 11.1451 .967427 10.4251 .967427H8.94762C8.80887 .359927 8.37387 .299927 7.89762 .299927H7.23012C6.85512 .299927 6.26637 .299927 6.08637 .967427H4.68387C3.94887 .967427 3.35637 1.74368 3.35637 2.38493V2.79368H1.15137C.738867 2.79368 .401367 3.13118 .401367 3.54368V20.2537C.401367 20.6662 .738867 21.0037 1.15137 21.0037H13.8489C14.2614 21.0037 14.5989 20.6662 14.5989 20.2537V3.54368C14.5989 3.13118 14.2614 2.79368 13.8489 2.79368ZM4.29387 2.38493C4.29387 2.18243 4.54137 1.90493 4.68387 1.90493H6.50262C6.76137 1.90493 6.97137 1.69493 6.97137 1.43618C6.97137 1.33868 6.97887 1.27868 6.98637 1.24118C7.05012 1.23368 7.15512 1.23368 7.23387 1.23368H7.90137C7.95012 1.23368 8.00637 1.23368 8.05137 1.23368C8.05512 1.27868 8.05887 1.34243 8.05887 1.43243C8.05887 1.69118 8.26887 1.90118 8.52762 1.90118H10.4289C10.5301 1.90118 10.7101 2.14493 10.7101 2.38118V2.78993H4.29762V2.38118L4.29387 2.38493ZM13.0989 19.4999H1.90137V4.29368H13.0989V19.5037V19.4999Z' fill='%23249EDC'/%3E%3Cpath d='M3.82512 16.0424H11.1751C11.4339 16.0424 11.6439 15.8324 11.6439 15.5736V6.88486C11.6439 6.62611 11.4339 6.41611 11.1751 6.41611H3.82512C3.56637 6.41611 3.35637 6.62611 3.35637 6.88486V15.5736C3.35637 15.8324 3.56637 16.0424 3.82512 16.0424ZM4.29387 15.1049V13.3686H10.7064V15.1049H4.29387ZM10.7101 7.35361V12.4311H4.29762V7.35361H10.7101Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 9.35989H8.83887C9.09762 9.35989 9.30762 9.14989 9.30762 8.89114C9.30762 8.63239 9.09762 8.42239 8.83887 8.42239H6.16512C5.90637 8.42239 5.69637 8.63239 5.69637 8.89114C5.69637 9.14989 5.90637 9.35989 6.16512 9.35989Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 11.3624H8.83887C9.09762 11.3624 9.30762 11.1524 9.30762 10.8937C9.30762 10.6349 9.09762 10.4249 8.83887 10.4249H6.16512C5.90637 10.4249 5.69637 10.6349 5.69637 10.8937C5.69637 11.1524 5.90637 11.3624 6.16512 11.3624Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-download::before{background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='18' viewBox='0 0 16 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.2017 17.1637H.798265C.364425 17.1637 0 16.7993 0 16.3655V12.3568C0 11.923 .364425 11.5585 .798265 11.5585C1.2321 11.5585 1.59653 11.923 1.59653 12.3568V15.5498H14.4035V12.3568C14.4035 11.923 14.7679 11.5585 15.2017 11.5585C15.6356 11.5585 16 11.923 16 12.3568V16.3655C16 16.7993 15.6529 17.1637 15.2017 17.1637Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.84381 12.9642 7.73969 12.9468 7.63557 12.8947C7.34056 12.7733 7.14967 12.4783 7.14967 12.1485L7.18437 .938127C7.18437 .504287 7.5488 .139862 7.98264 .139862C8.41648 .139862 8.7809 .504287 8.7809 .938127L8.7462 10.257L12.8416 6.33509C13.154 6.02273 13.6746 6.04008 13.9696 6.35244C14.282 6.66481 14.2646 7.18542 13.9523 7.48043L8.50325 12.7386C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.73969 12.9642 7.54881 12.8947 7.39262 12.7386L2.03037 7.53249C1.718 7.22012 1.70065 6.71687 2.01301 6.40451C2.32538 6.09214 2.82863 6.07479 3.141 6.38715L8.50325 11.5932C8.81562 11.9056 8.83297 12.4088 8.52061 12.7212C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-expand::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64375 10.9125C6.9375 11.2062 6.93125 11.6812 6.64375 11.9687L2.57502 16H3.79375C4.20625 16 4.54376 16.3375 4.54376 16.75C4.54376 17.1625 4.20625 17.5 3.79375 17.5H.756264C.556264 17.5 .36876 17.4187 .22501 17.2812C.22501 17.2812 .206248 17.25 .193748 17.2375C.143748 17.1812 .100004 17.1125 .0625038 17.0437C.0375038 16.9687 .0187492 16.8937 .0187492 16.8187C.0187492 16.8 .0062561 16.7813 .0062561 16.7625V13.725C.0187561 13.3125 .356257 12.9875 .768757 12.9937C1.16876 13 1.48752 13.325 1.50002 13.725V14.9688L5.5875 10.9187C5.88125 10.6312 6.35 10.6312 6.64375 10.9187V10.9125ZM17.5063 .743732C17.5063 .543732 17.425 .356235 17.2875 .218735C17.2875 .218735 17.2562 .199998 17.2437 .193748C17.1875 .137498 17.1188 .0937347 17.0438 .0624847C16.9688 .0374847 16.8938 .0187492 16.8188 .0187492C16.8 .0187492 16.7813 .00623703 16.7625 .00623703H13.725C13.3125 .00623703 12.975 .343745 12.975 .756245C12.975 1.16874 13.3125 1.50623 13.725 1.50623H14.9688L11.1312 5.37498C10.8437 5.67498 10.8563 6.14999 11.1563 6.43124C11.45 6.71249 11.9063 6.70624 12.1938 6.43124L16.0125 2.575V3.79375C16.0125 4.20625 16.35 4.54372 16.7625 4.54372C17.175 4.54372 17.5125 4.20625 17.5125 3.79375V.756245L17.5063 .743732ZM16.7562 12.9688C16.3437 12.9688 16.0063 13.3063 16.0063 13.7188V14.8937L12.1938 10.925C11.9063 10.625 11.4375 10.6188 11.1375 10.9063C10.8375 11.1938 10.8313 11.6625 11.1188 11.9625L15 16.0062H13.7188C13.3063 16.0062 12.9688 16.3437 12.9688 16.7562C12.9688 17.1687 13.3063 17.5063 13.7188 17.5063H16.7562C16.85 17.5063 16.95 17.4875 17.0375 17.45C17.0875 17.425 17.1313 17.3937 17.175 17.3625C17.2063 17.3437 17.2438 17.325 17.275 17.3C17.3313 17.2375 17.375 17.1687 17.4125 17.1C17.4188 17.0875 17.4375 17.075 17.4438 17.0562C17.45 17.025 17.4563 16.9938 17.4625 16.9625C17.4813 16.9 17.5 16.8375 17.5 16.7687V13.725C17.5 13.3125 17.1687 12.975 16.7562 12.975V12.9688ZM.750008 4.53125C1.16251 4.53125 1.50002 4.19374 1.50002 3.78124V2.5L5.59376 6.43124C5.89376 6.71874 6.36251 6.70626 6.65001 6.41251C6.93751 6.11876 6.92501 5.64375 6.63126 5.35625L2.61251 1.49998H3.7875C4.2 1.49998 4.53751 1.16249 4.53751 .749989C4.53751 .337489 4.2 0 3.7875 0H.743752C.668752 0 .600004 .0187355 .531254 .0437355C.506254 .0499855 .481263 .0437477 .462513 .0562477C.443763 .0687477 .425015 .0812462 .406265 .0937462C.337515 .124996 .275004 .168741 .218754 .224991H.212498C.212498 .224991 .175 .28125 .15625 .3125C.11875 .3625 .0812477 .4125 .0562477 .46875C.0374977 .525 .0249992 .587499 .0187492 .643749C.0124992 .674999 0 .712482 0 .743732V3.78124C0 4.19374 .337508 4.53125 .750008 4.53125Z' fill='white'/%3E%3C/svg%3E%0A\")}@keyframes slow-scroll{100%{transform:translateY(-50%)}}.sc-hero{overflow:hidden;background-color:#212d35;background-repeat:repeat-y;background-image:url(\"data:image/svg+xml,%3Csvg width='389' height='17' viewBox='0 0 389 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M.638672 7.80824L.638672 9.2566C.638672 9.52364 .85538 9.74024 1.12262 9.74024H2.57204C2.83928 9.74024 3.05598 9.52364 3.05598 9.2566V7.80824C3.05598 7.54119 2.83928 7.32472 2.57204 7.32472L1.12262 7.32472C.85538 7.32472 .638672 7.54119 .638672 7.80824Z' fill='url(%23paint0_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.9639 7.80824V9.2566C10.9639 9.52364 11.1806 9.74024 11.4478 9.74024L12.8972 9.74024C13.1645 9.74024 13.3812 9.52364 13.3812 9.2566V7.80824C13.3812 7.54119 13.1645 7.32471 12.8972 7.32471L11.4478 7.32471C11.1806 7.32471 10.9639 7.54119 10.9639 7.80824Z' fill='url(%23paint1_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M21.2891 7.80823V9.2566C21.2891 9.52364 21.5058 9.74024 21.773 9.74024L23.2224 9.74024C23.4897 9.74024 23.7064 9.52364 23.7064 9.2566V7.80823C23.7064 7.54119 23.4897 7.32471 23.2224 7.32471L21.773 7.32471C21.5058 7.32471 21.2891 7.54119 21.2891 7.80823Z' fill='url(%23paint2_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M31.6143 7.80823V9.2566C31.6143 9.52364 31.831 9.74024 32.0982 9.74024H33.5476C33.8149 9.74024 34.0316 9.52364 34.0316 9.2566V7.80823C34.0316 7.54119 33.8149 7.32471 33.5476 7.32471L32.0982 7.32471C31.831 7.32471 31.6143 7.54119 31.6143 7.80823Z' fill='url(%23paint3_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M41.9395 7.80823V9.2566C41.9395 9.52364 42.1562 9.74024 42.4234 9.74024H43.8728C44.1401 9.74024 44.3568 9.52364 44.3568 9.2566V7.80823C44.3568 7.54119 44.1401 7.32471 43.8728 7.32471L42.4234 7.32471C42.1562 7.32471 41.9395 7.54119 41.9395 7.80823Z' fill='url(%23paint4_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M52.5076 7.80823V9.2566C52.5076 9.52364 52.7243 9.74024 52.9916 9.74024H54.441C54.7082 9.74024 54.9249 9.52364 54.9249 9.2566V7.80823C54.9249 7.54119 54.7082 7.32471 54.441 7.32471L52.9916 7.32471C52.7243 7.32471 52.5076 7.54119 52.5076 7.80823Z' fill='url(%23paint5_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M62.8331 7.80823V9.2566C62.8331 9.52364 63.0493 9.74024 63.3165 9.74024H64.7664C65.0332 9.74024 65.2504 9.52364 65.2504 9.2566V7.80823C65.2504 7.54119 65.0332 7.32471 64.7664 7.32471L63.3165 7.32471C63.0493 7.32471 62.8331 7.54119 62.8331 7.80823Z' fill='url(%23paint6_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M73.1583 7.80823V9.2566C73.1583 9.52364 73.3745 9.74024 73.6417 9.74024H75.0916C75.3584 9.74024 75.5756 9.52364 75.5756 9.2566V7.80823C75.5756 7.54119 75.3584 7.32471 75.0916 7.32471L73.6417 7.32471C73.3745 7.32471 73.1583 7.54119 73.1583 7.80823Z' fill='url(%23paint7_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M83.4835 7.80823V9.2566C83.4835 9.52364 83.6997 9.74024 83.9669 9.74024H85.4168C85.6836 9.74024 85.9008 9.52364 85.9008 9.2566V7.80823C85.9008 7.54119 85.6836 7.32471 85.4168 7.32471L83.9669 7.32471C83.6997 7.32471 83.4835 7.54119 83.4835 7.80823Z' fill='url(%23paint8_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M93.8087 7.80823V9.2566C93.8087 9.52364 94.0249 9.74024 94.2921 9.74024H95.742C96.0088 9.74024 96.226 9.52364 96.226 9.2566V7.80823C96.226 7.54119 96.0088 7.32471 95.742 7.32471L94.2921 7.32471C94.0249 7.32471 93.8087 7.54119 93.8087 7.80823Z' fill='url(%23paint9_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M104.134 7.80823V9.2566C104.134 9.52364 104.35 9.74024 104.617 9.74024H106.067C106.334 9.74024 106.551 9.52364 106.551 9.2566V7.80823C106.551 7.54119 106.334 7.32471 106.067 7.32471L104.617 7.32471C104.35 7.32471 104.134 7.54119 104.134 7.80823Z' fill='url(%23paint10_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M114.702 7.80823V9.2566C114.702 9.52364 114.918 9.74024 115.185 9.74024L116.635 9.74024C116.902 9.74024 117.119 9.52364 117.119 9.25659V7.80823C117.119 7.54119 116.902 7.32471 116.635 7.32471L115.185 7.32471C114.918 7.32471 114.702 7.54119 114.702 7.80823Z' fill='url(%23paint11_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M125.027 7.80823V9.25659C125.027 9.52364 125.243 9.74024 125.511 9.74024L126.961 9.74024C127.227 9.74024 127.445 9.52364 127.445 9.25659V7.80823C127.445 7.54119 127.227 7.32471 126.961 7.32471L125.511 7.32471C125.243 7.32471 125.027 7.54119 125.027 7.80823Z' fill='url(%23paint12_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M135.352 7.80823V9.25659C135.352 9.52364 135.569 9.74024 135.836 9.74024H137.286C137.553 9.74024 137.77 9.52364 137.77 9.25659V7.80823C137.77 7.54119 137.553 7.32471 137.286 7.32471L135.836 7.32471C135.569 7.32471 135.352 7.54119 135.352 7.80823Z' fill='url(%23paint13_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M145.678 7.80823V9.25659C145.678 9.52364 145.894 9.74024 146.161 9.74024H147.611C147.878 9.74024 148.095 9.52364 148.095 9.25659V7.80823C148.095 7.54119 147.878 7.32471 147.611 7.32471L146.161 7.32471C145.894 7.32471 145.678 7.54119 145.678 7.80823Z' fill='url(%23paint14_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M156.003 7.80823V9.25659C156.003 9.52364 156.219 9.74024 156.486 9.74024H157.936C158.203 9.74024 158.42 9.52364 158.42 9.25659V7.80823C158.42 7.54119 158.203 7.32471 157.936 7.32471L156.486 7.32471C156.219 7.32471 156.003 7.54119 156.003 7.80823Z' fill='url(%23paint15_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M166.328 7.80823V9.25659C166.328 9.52363 166.544 9.74024 166.811 9.74024H168.261C168.528 9.74024 168.745 9.52363 168.745 9.25659V7.80823C168.745 7.54119 168.528 7.32471 168.261 7.32471L166.811 7.32471C166.544 7.32471 166.328 7.54119 166.328 7.80823Z' fill='url(%23paint16_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M176.896 7.80823V9.25659C176.896 9.52363 177.112 9.74023 177.38 9.74023H178.83C179.096 9.74023 179.313 9.52363 179.313 9.25659V7.80823C179.313 7.54119 179.096 7.32471 178.83 7.32471L177.38 7.32471C177.112 7.32471 176.896 7.54119 176.896 7.80823Z' fill='url(%23paint17_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M187.221 7.80823V9.25659C187.221 9.52363 187.438 9.74023 187.705 9.74023H189.155C189.421 9.74023 189.639 9.52363 189.639 9.25659V7.80823C189.639 7.54119 189.421 7.32471 189.155 7.32471L187.705 7.32471C187.438 7.32471 187.221 7.54119 187.221 7.80823Z' fill='url(%23paint18_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M199.639 7.80824V9.2566C199.639 9.52364 199.855 9.74024 200.123 9.74024H201.572C201.839 9.74024 202.056 9.52364 202.056 9.2566V7.80824C202.056 7.54119 201.839 7.32472 201.572 7.32472L200.123 7.32472C199.855 7.32472 199.639 7.54119 199.639 7.80824Z' fill='url(%23paint19_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M209.964 7.80824V9.2566C209.964 9.52364 210.181 9.74024 210.448 9.74024L211.897 9.74024C212.164 9.74024 212.381 9.52364 212.381 9.2566V7.80824C212.381 7.54119 212.164 7.32471 211.897 7.32471L210.448 7.32471C210.181 7.32471 209.964 7.54119 209.964 7.80824Z' fill='url(%23paint20_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M220.289 7.80823V9.2566C220.289 9.52364 220.506 9.74024 220.773 9.74024L222.222 9.74024C222.49 9.74024 222.706 9.52364 222.706 9.2566V7.80823C222.706 7.54119 222.49 7.32471 222.222 7.32471L220.773 7.32471C220.506 7.32471 220.289 7.54119 220.289 7.80823Z' fill='url(%23paint21_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M230.614 7.80823V9.2566C230.614 9.52364 230.831 9.74024 231.098 9.74024H232.548C232.815 9.74024 233.032 9.52364 233.032 9.2566V7.80823C233.032 7.54119 232.815 7.32471 232.548 7.32471L231.098 7.32471C230.831 7.32471 230.614 7.54119 230.614 7.80823Z' fill='url(%23paint22_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M240.939 7.80823V9.2566C240.939 9.52364 241.156 9.74024 241.423 9.74024H242.873C243.14 9.74024 243.357 9.52364 243.357 9.2566V7.80823C243.357 7.54119 243.14 7.32471 242.873 7.32471L241.423 7.32471C241.156 7.32471 240.939 7.54119 240.939 7.80823Z' fill='url(%23paint23_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M251.508 7.80823V9.2566C251.508 9.52364 251.724 9.74024 251.992 9.74024H253.441C253.708 9.74024 253.925 9.52364 253.925 9.2566V7.80823C253.925 7.54119 253.708 7.32471 253.441 7.32471L251.992 7.32471C251.724 7.32471 251.508 7.54119 251.508 7.80823Z' fill='url(%23paint24_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M261.833 7.80823V9.2566C261.833 9.52364 262.049 9.74024 262.317 9.74024H263.766C264.033 9.74024 264.25 9.52364 264.25 9.2566V7.80823C264.25 7.54119 264.033 7.32471 263.766 7.32471L262.317 7.32471C262.049 7.32471 261.833 7.54119 261.833 7.80823Z' fill='url(%23paint25_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M272.158 7.80823V9.2566C272.158 9.52364 272.374 9.74024 272.642 9.74024H274.092C274.358 9.74024 274.576 9.52364 274.576 9.2566L274.576 7.80823C274.576 7.54119 274.358 7.32471 274.092 7.32471L272.642 7.32471C272.374 7.32471 272.158 7.54119 272.158 7.80823Z' fill='url(%23paint26_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M282.483 7.80823V9.2566C282.483 9.52364 282.7 9.74024 282.967 9.74024H284.417C284.684 9.74024 284.901 9.52364 284.901 9.2566V7.80823C284.901 7.54119 284.684 7.32471 284.417 7.32471L282.967 7.32471C282.7 7.32471 282.483 7.54119 282.483 7.80823Z' fill='url(%23paint27_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M292.809 7.80823L292.809 9.2566C292.809 9.52364 293.025 9.74024 293.292 9.74024H294.742C295.009 9.74024 295.226 9.52364 295.226 9.2566V7.80823C295.226 7.54119 295.009 7.32471 294.742 7.32471L293.292 7.32471C293.025 7.32471 292.809 7.54119 292.809 7.80823Z' fill='url(%23paint28_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M303.134 7.80823L303.134 9.2566C303.134 9.52364 303.35 9.74024 303.617 9.74024H305.067C305.334 9.74024 305.551 9.52364 305.551 9.2566V7.80823C305.551 7.54119 305.334 7.32471 305.067 7.32471L303.617 7.32471C303.35 7.32471 303.134 7.54119 303.134 7.80823Z' fill='url(%23paint29_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M313.702 7.80823L313.702 9.2566C313.702 9.52364 313.918 9.74024 314.185 9.74024L315.635 9.74024C315.902 9.74024 316.119 9.52364 316.119 9.25659V7.80823C316.119 7.54119 315.902 7.32471 315.635 7.32471L314.185 7.32471C313.918 7.32471 313.702 7.54119 313.702 7.80823Z' fill='url(%23paint30_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M324.027 7.80823V9.25659C324.027 9.52364 324.243 9.74024 324.511 9.74024L325.961 9.74024C326.227 9.74024 326.445 9.52364 326.445 9.25659V7.80823C326.445 7.54119 326.227 7.32471 325.961 7.32471L324.511 7.32471C324.243 7.32471 324.027 7.54119 324.027 7.80823Z' fill='url(%23paint31_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M334.352 7.80823V9.25659C334.352 9.52364 334.569 9.74024 334.836 9.74024H336.286C336.553 9.74024 336.77 9.52364 336.77 9.25659L336.77 7.80823C336.77 7.54119 336.553 7.32471 336.286 7.32471L334.836 7.32471C334.569 7.32471 334.352 7.54119 334.352 7.80823Z' fill='url(%23paint32_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M344.678 7.80823V9.25659C344.678 9.52364 344.894 9.74024 345.161 9.74024H346.611C346.878 9.74024 347.095 9.52364 347.095 9.25659L347.095 7.80823C347.095 7.54119 346.878 7.32471 346.611 7.32471L345.161 7.32471C344.894 7.32471 344.678 7.54119 344.678 7.80823Z' fill='url(%23paint33_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M355.003 7.80823V9.25659C355.003 9.52364 355.219 9.74024 355.486 9.74024H356.936C357.203 9.74024 357.42 9.52364 357.42 9.25659L357.42 7.80823C357.42 7.54119 357.203 7.32471 356.936 7.32471L355.486 7.32471C355.219 7.32471 355.003 7.54119 355.003 7.80823Z' fill='url(%23paint34_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M365.328 7.80823V9.25659C365.328 9.52363 365.544 9.74024 365.811 9.74024H367.261C367.528 9.74024 367.745 9.52363 367.745 9.25659V7.80823C367.745 7.54119 367.528 7.32471 367.261 7.32471L365.811 7.32471C365.544 7.32471 365.328 7.54119 365.328 7.80823Z' fill='url(%23paint35_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M375.896 7.80823V9.25659C375.896 9.52363 376.112 9.74023 376.38 9.74023H377.83C378.096 9.74023 378.313 9.52363 378.313 9.25659V7.80823C378.313 7.54119 378.096 7.32471 377.829 7.32471L376.38 7.32471C376.112 7.32471 375.896 7.54119 375.896 7.80823Z' fill='url(%23paint36_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M386.221 7.80823V9.25659C386.221 9.52363 386.438 9.74023 386.705 9.74023H388.155C388.421 9.74023 388.639 9.52363 388.639 9.25659V7.80823C388.639 7.54119 388.421 7.32471 388.155 7.32471L386.705 7.32471C386.438 7.32471 386.221 7.54119 386.221 7.80823Z' fill='url(%23paint37_linear_8295_70635)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint1_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint2_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint3_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint4_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint5_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint6_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint7_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint8_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint9_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint10_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint11_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint12_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint13_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint14_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint15_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint16_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint17_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint18_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint19_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint20_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint21_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint22_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint23_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint24_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint25_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint26_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint27_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint28_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint29_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint30_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint31_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint32_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint33_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint34_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint35_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint36_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint37_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\")}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:first-child{position:relative;z-index:3}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:absolute;height:100%;width:100%;top:0;left:-24px}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{content:\"\";display:block;z-index:1;position:absolute;top:-64px;left:0;width:150%;height:calc(100% + 160px);background-color:rgb(32 44 53 / .9)}.sc-body__content .heading-3-v2,.sc-hero__headline .heading-1-v2{text-transform:none}.sc-body__content span.snowflake-image-caption{display:block!important;font-style:italic}.sc-body__content .snowflake-text p+ul{margin-top:24px!important;padding-left:16px!important}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#e9eaeb!important;font-size:16px}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification.is-large .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#fff!important;font-size:18px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child{display:flex;justify-content:flex-start;align-items:center;gap:8px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child::before{content:\"\";display:inline-block;width:16px;height:16px;background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 0C3.58146 0 0 3.58146 0 8C0 12.4185 3.58146 16 8 16C12.4185 16 16 12.4185 16 8C16 3.58146 12.4185 0 8 0ZM12.7184 5.91984L7.33471 11.3026C7.31293 11.3244 7.31293 11.3454 7.29198 11.3454L7.20653 11.4308C6.94933 11.688 6.54132 11.7525 6.21962 11.6235C6.11238 11.5808 6.00514 11.5163 5.9197 11.4308L5.83425 11.3454C5.83425 11.3454 5.83425 11.3236 5.81246 11.3236L3.28149 8.79347C2.93799 8.44997 2.93799 7.87107 3.28149 7.50664L3.36694 7.42119C3.71044 7.07769 4.28934 7.07769 4.65377 7.42119L6.58401 9.35143L11.3877 4.5477C11.7312 4.2042 12.3101 4.2042 12.6746 4.5477L12.76 4.63315C13.0826 4.99758 13.0828 5.55541 12.7184 5.91984Z' fill='%230E8A16'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-color:#fff;border-radius:100%}.sc-hero__byline{padding-top:8px}.sc-hero__byline p{color:#e2e2e2;margin-top:0!important}.sc-hero pre[class*=language-]{overflow:visible}.snowflake-code-snippet,.snowflake-code-snippet code,.snowflake-code-snippet pre{font-size:16px}.sc-hero__code-snippet:not(pre)\u003Ecode[class*=language-],.sc-hero__code-snippet pre[class*=language-]{background:0 0}.sc-hero__code-snippet{opacity:.8;background-color:transparent!important;position:absolute;top:0;right:0;width:100%;animation:240s linear 1s forwards slow-scroll}.sc-hero__button-container .snowflake-flexible-column-container-items{padding:0 0 24px;margin-top:-8px;margin-left:24px}.sc-sidebar__partner-logo{width:100%;max-width:140px;margin-top:8px}.sc-sidebar__partner-logo .cmp-image__image{border-radius:0}.sc-tag-cluster.snowflake-text ul{list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;margin:0}.sc-tag-cluster.snowflake-text li{color:#373f41;border-radius:4px;display:inline-block;padding:6px;text-transform:uppercase;letter-spacing:1px;font-size:12px!important;line-height:12px!important;margin:0!important;background-color:#f3f3f3}.sc-body .share-icon svg{height:24px;cursor:pointer}.sc-body .share-icon svg:hover path{fill:var(--ui-02)}.sc-overview__webinar-promo-banner{align-items:center;border:1px solid #ccc;padding:var(--spacing-02)}.sc-overview__webinar-promo-banner .snowflake-content-chip-image{max-width:32px;margin-right:var(--spacing-02);line-height:0}.sc-overview__webinar-promo-banner .snowflake-content-chip-image__image,.summit-speaker-card .snowflake-card-v2-advanced-image__image{aspect-ratio:1}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{font-size:14px;font-family:Lato,sans-serif}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child){font-weight:400}.sc-overview__webinar-promo-banner .snowflake-content-chip-button .snowflake-button-container{font-size:14px!important}.diagram-group__button{position:absolute;bottom:24px;right:24px;background-color:#212c35!important}.section--mountains-bottom,.summit-hp-hero{position:relative}.sc-cert-banner{background-color:#212d35;border-radius:8px;padding:24px;overflow:hidden}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;align-items:center}:root{--text-secondary:#706f6f;--summit-bg-ltblue:#eaf8fd;--summit-bg-blue:#249edc;--summit-border:#d2d1d4;--summit-border-radius:8px;--summit-card-padding:32px;--summit-card-padding-sm:28px}.section--mountains-bottom::after,.section--mountains-bottom::before{content:\"\";display:block;position:absolute;bottom:-1px;max-width:400px;background-size:100% auto;height:100%;width:30%;line-height:0;background-repeat:no-repeat}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center;align-items:center}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;margin:0 8px!important}.button-group .snowflake-button-container{font-family:Texta,sans-serif}.section--summit-bg-ltblue{background-color:var(--summit-bg-ltblue)}.section--summit-bg-blue,.summit-hero-secondary{background-color:var(--summit-bg-blue)}.section--mountains-bottom::before{left:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M401.523 308.761H0V0L181.63 182.431L228.479 135.531L401.523 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom left}.section--mountains-bottom::after{right:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 308.761H401.523V0L219.893 182.431L173.044 135.531L0 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom right}.summit-hp-hero{overflow:hidden}.summit-hero__bg-video{position:absolute;top:50%;left:50%;width:120%;height:100%;opacity:.3;transform:translate(-50%,-50%)}.summit-hero__bg-svg,.summit-prefooter__bg-image,.summit-secondary-hero__bg-image{position:absolute;bottom:0;left:0;width:100%}.summit-hp-promo-banner__headline .heading-4-v2{font-weight:900}.summit-hero-secondary .hero-lottie__left{position:absolute;bottom:0;left:0;width:30%;line-height:0}.summit-timeline__card::after,.summit-timeline__card::before{bottom:0;left:50%;position:absolute;display:block;background-color:var(--ui-01);content:\"\"}.summit-hero-secondary .snowflake-text p{font-size:24px!important;line-height:32px!important;max-width:720px;margin:0 auto}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:center}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;max-width:25%}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid #fff}.summit-timeline__card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding);position:relative;background-color:#fff}.summit-timeline__card::before{width:20px;height:20px;border-radius:100%;transform:translate(-50%,50%)}.summit-timeline__card::after{width:3px;height:50px;transform:translate(-50%,100%)}.summit-timeline-card__icon{width:48px;height:48px}.summit-timeline-card__headline .heading-3-v2{font-size:32px}.faq-group{border:1px solid var(--ui-12);border-radius:4px;background-color:#fff}.faq-group__question{padding:24px}.faq-group__question:hover{color:var(--ui-01);cursor:pointer}.faq-group__question .heading-4-v2,.faq-group__question .heading-5-v2{position:relative;padding-right:64px}.faq-group__question .heading-4-v2::after,.faq-group__question .heading-5-v2::after{content:\"\";display:block;width:32px;height:32px;background-image:url(\"data:image/svg+xml,%3Csvg width='29' height='16' viewBox='0 0 29 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M14.16 14.6807C14.2537 14.7957 14.3719 14.8884 14.506 14.952C14.64 15.0157 14.7866 15.0487 14.935 15.0487C15.0834 15.0487 15.2299 15.0157 15.3639 14.952C15.498 14.8884 15.6162 14.7957 15.71 14.6807V14.6807L28.51 2.00068C29.07 1.43068 29.07 .92068 28.51 .44068C27.95 -.0393204 27.43 -.11932 26.96 .44068L14.94 12.0007L2.99996 .45068C2.90725 .322624 2.7855 .218374 2.6447 .146483C2.50389 .0745926 2.34805 .0371094 2.18996 .0371094C2.03187 .0371094 1.87603 .0745926 1.73522 .146483C1.59442 .218374 1.47267 .322624 1.37996 .45068C.819961 .93068 .819961 1.45068 1.37996 2.01068L14.16 14.6807Z' fill='black'/%3E%3C/svg%3E%0A\");background-size:80% auto;background-repeat:no-repeat;background-position:center;position:absolute;top:-2px;right:0;transition:.3s 150ms}.faq-group__question .heading-5-v2::after{top:-4px}.faq-group__answer{max-height:0;overflow:hidden;width:95%;padding:0 24px;transition:.5s}.faq-group__answer\u003Espan{display:block;padding-bottom:24px}.is-open .faq-group__answer{max-height:600px;transition:1s}.is-open .faq-group__question .heading-4-v2::after,.is-open .faq-group__question .heading-5-v2::after{transform:rotate(180deg);transition:.3s}.summit-agenda{box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);border-radius:8px;background-color:#fff;max-width:980px;margin-left:auto;margin-right:auto;padding:40px;width:90%}.agenda-item{border-radius:8px;background-color:#d4f0fa;padding:16px;border-left:4px solid var(--ui-01);position:relative}.summit-pricing-block__tile.is-past,.summit-pricing-block__tile.is-upcoming{pointer-events:none;border-color:#d2d1d4}p.agenda-item__time{width:25%;font-family:Texta!important;font-size:32px!important;font-weight:900!important;text-transform:uppercase!important;max-width:140px}@media screen and (max-width:991px){#partnerResources .section--resource-hub .snowflake-button-link .snowflake-button-container{font-size:14px!important;line-height:20px!important;margin-top:4px}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items{display:flex;flex-direction:column}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items\u003Ediv{width:100%}.sc-cert-banner__left{text-align:center}.sc-cert-banner__left .solution-center-hero__certification .snowflake-title-v2-line{justify-content:center}.summit-hero__bg-video{width:200%}.summit-leadership-grid .snowflake-flexible-column-container-items{grid-template-columns:repeat(2,1fr)}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:50%!important;max-width:50%!important}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:none!important}.summit-agenda{padding:24px}p.agenda-item__time{font-size:24px!important;width:auto;white-space:nowrap;padding-right:24px}}.agenda-item\u003Espan{display:flex;align-items:center}.summit-add-on-block,.summit-pricing-block{border:1px solid #d2d1d4;border-radius:8px;overflow:hidden;box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);background-color:#fff}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 20px 20px}.summit-pricing-block__tile{padding:24px 20px;border-radius:4px;background:#fff;border:1px solid var(--ui-01);position:relative;transition:background-color .3s}.summit-pricing-block__tile:hover{background-color:var(--ui-01);transition:background-color .3s}.summit-pricing-block__tile.is-past{background-color:#d4f0fa}.summit-pricing-block__tile:hover .black-blue-text-color .snowflake-title-v2-line{color:#fff!important;transition:color .3s}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::after,.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::after,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-pricing-block__tile.is-past .snowflake-content-chip-button,.summit-pricing-block__tile.is-upcoming .snowflake-content-chip-button,.summit-speaker-card .snowflake-card-v2-advanced-tag-indicator{display:none}.summit-pricing-block__tile.is-past .black-blue-text-color .snowflake-title-v2-line{color:#7cc7eb!important}.summit-pricing-block__tile.is-upcoming .black-blue-text-color .snowflake-title-v2-line{color:#8c8c8c!important}.summit-pricing-block__aside{background-color:#d4f0fa;border:1px solid #d2d1d4;border-radius:8px;padding:24px;width:100%}.summit-pricing-block__aside li::marker{color:var(--ui-01)}.summit-pricing-block__aside-headline .heading-5-v2{font-weight:900;margin-bottom:12px}.summit-pricing-block__header{background:#000;padding:24px 40px}.summit-pricing-block__header .heading-4-v2{font-weight:900;letter-spacing:.5px}.bwwidth100,.snowflake-mega-nav-dropdown-footer-content,.summit-pricing-block__tile .black-blue-text-color{width:100%}.summit-pricing-block__tile .heading-5-v2{position:static}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:first-child{text-transform:uppercase;font-weight:900!important;letter-spacing:.25px;font-size:24px!important}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:nth-child(2){margin-top:8px;font-family:Lato,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:16px}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{font-weight:900!important;font-size:40px!important}.snowflake-mega-nav-nav-item\u003Ea:hover .snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title,.summit-pricing-block__tile:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:var(--ui-01)!important}.summit-pricing-block__tile:hover:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:#fff!important}.summit-pricing-block__tile.is-past .heading-5-v2 span.snowflake-title-v2-line:last-child{text-decoration:line-through}.summit-pricing-block__tile .snowflake-content-chip-button{margin-top:0;white-space:nowrap;display:none}.snowflake-card-v2-advanced.no-link{pointer-events:none!important}.snowpro-card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding-sm);display:flex;height:100%}.snowpro-card__headline{margin:24px 0 12px}.snowpro-card__pricing{margin-top:48px}.snowpro-card .snowflake-text .snowpro-card__price{color:var(--ui-01);font-weight:900;font-size:40px!important;font-family:Texta,sans-serif}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid var(--summit-border)}.summit-stat-card{padding:0 40px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:first-child{font-size:64px;line-height:52px;margin-bottom:8px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:last-child{font-size:32px;line-height:30px;margin-bottom:16px}.summit-speaker-card .snowflake-card-v2-advanced-title{margin-bottom:var(--spacing-01)}.summit-add-on-card{padding:24px;border:1px solid #d2d1d4;border-radius:8px}.summit-add-on__subhead{padding-left:40px;padding-right:40px}.partner-card__logo-grid,.partner-card__logo-single{padding:40px}.partner-card__logo-grid .snowflake-image-container .cmp-image__image,.partner-card__logo-single .snowflake-image-container .cmp-image__image{border-radius:0;max-width:240px;margin:0 auto}.partner-card\u003E.container,.partner-card\u003E.container\u003E.aem-container,.partner-card\u003E.container\u003E.cmp-container{height:100%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;gap:24px;align-items:stretch}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:40px 24px;justify-content:center;align-items:center}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important}.partner-card{border-radius:8px;border:1px solid #d2d1d4;overflow:hidden;height:100%;background-color:#fff}.partner-card__header{padding:16px 24px;border-bottom:1px solid #d2d1d4}.partner-card__header.is-purple{background-color:#7d44cf}.partner-card__header h4{display:flex;flex-direction:row!important;align-items:center;gap:12px}.partner-card__header h4::before{vertical-align:middle;content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='black'/%3E%3C/svg%3E%0A\")}.partner-card__header.is-purple h4::before{background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='white'/%3E%3C/svg%3E%0A\")}.sf-blue-mountains{background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;background-image:url(\"data:image/svg+xml,%3Csvg width='1361' height='410' viewBox='0 0 1361 410' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1360.25 410L1065.53 114.309L976.256 203.875L773.049 0L364.393 410H1360.25Z' fill='%233AA8DF'/%3E%3Cpath d='M274.778 410L137.467 272.238L.15625 410H274.778Z' fill='%233AA8DF'/%3E%3C/svg%3E%0A\")}.bwalignr,.main-pr-body .bwalignr{text-align:right}.bwblockalignl{margin-left:0;margin-right:auto}.bwcellpmargin{margin-top:0;margin-bottom:0}.bwlistdisc{list-style-type:disc}.bwpadb3{padding-bottom:4px}.bwpadb4{padding-bottom:5px}.bwpadl0{padding-left:0}.bwpadl3{padding-left:15px}.bwpadl6{padding-left:30px}.bwpadl9{padding-left:45px}.bwpadl12{padding-left:60px}.bwpadr0{padding-right:0}.bwtablemarginb{margin-bottom:10px}.bwvertalignb{vertical-align:bottom}.bwvertalignt{vertical-align:top}.bwsinglebottom{border-bottom:1pt solid #000}.bwdoublebottom{border-bottom:2.25pt double #000}.bwwidth1{width:1%}.bwwidth2{width:2%}.bwwidth6{width:6%}.bwwidth7{width:7%}.bwwidth8{width:8%}.bwwidth10{width:10%}.bwwidth12{width:12%}.bwwidth32{width:32%}.bwwidth44{width:44%}.bwwidth72{width:72%}.bwwidth97{width:97%}.main-pr-body{font-size:18px;line-height:26px}.main-pr-body img{display:block;width:100%;height:auto!important;border-radius:var(--small-border-radius)}.main-pr-body table{width:100%;display:block}.main-pr-body tbody{background-color:#f7f7f7}.main-pr-body .bwsinglebottom{border-bottom:1pt solid #000!important}.main-pr-body td.bwwidth44{padding-right:40px}.main-pr-body .bw-release-story{font-family:Lato,sans-serif}.main-pr-body .bw-release-story sup,.snowflake-mega-nav-dropdown-header-content-right a{white-space:nowrap}.main-pr-body .bw-release-story\u003E*,.main-pr-body\u003Espan\u003E*{margin-bottom:2rem!important}.snowflake-text.main-pr-body tbody,.snowflake-text.main-pr-body tbody p{font-size:14px!important;line-height:20px!important;width:100%;display:block}.press-body .snowflake-flexible-column-container-items{gap:var(--spacing-08)}.about-snowflake{border:1px solid #ccc;background-color:var(--ui-background-05);padding:24px;border-radius:8px;margin-top:0}.about-snowflake__logo{max-width:140px;margin-top:16px}.hero--press .snowflake-hero-system-inner{max-width:1408px;margin:0 auto!important}#arcticNavItem{flex-direction:column}#arcticNavItem::before{content:\"Featured Open Source Technologies\";display:block;margin-top:48px;margin-bottom:24px;font-size:16px!important;line-height:16px!important;font-weight:800!important;text-transform:uppercase}@media screen and (min-width:768px){.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:relative;height:100%;top:auto;left:auto;width:auto}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{background:linear-gradient(180deg,#202c35 -7.5%,#fff0 51.25%,#202c35 107.69%)}.sc-hero__byline\u003Espan{display:flex;flex-wrap:wrap}.sc-hero__byline p:not(:last-child)::after{content:\"|\";margin:0 12px;opacity:.5}.sc-hero__button-container .snowflake-flexible-column-container-items{position:absolute;bottom:0;padding:0;margin:0 24px 0 0}.sc-hero__button-container .hero-watch-the-demo{padding:12px 16px!important;float:right;margin-bottom:48px;background-color:rgb(35 45 54 / .8)}.summit-overview-stat{padding:0 40px}.summit-timeline{border-bottom:3px solid var(--ui-01);margin-bottom:64px}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 40px 40px}#arcticNavItem::before{font-size:12px!important;margin-bottom:8px;margin-top:16px}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{line-height:20px!important}.snowflake-card .heading-2.snowflake-title-line{font-size:24px!important;line-height:28px!important}}@media screen and (min-width:992px){.hp-hero__eyebrow a{gap:12px;margin-left:0;margin-right:0}.hp-hero__eyebrow a::after{content:\"\";background-image:url(\"data:image/svg+xml,%3Csvg width='6' height='11' viewBox='0 0 6 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5.49134 5.79438C5.53447 5.75922 5.56923 5.71489 5.5931 5.66463C5.61697 5.61436 5.62935 5.55941 5.62935 5.50376C5.62935 5.44811 5.61697 5.39316 5.5931 5.34289C5.56923 5.29263 5.53447 5.2483 5.49134 5.21314L.736339 .413136C.522589 .203135 .331339 .203135 .151339 .413136C-.0286612 .623135 -.0586612 .818135 .151339 .994386L4.48634 5.50188L.155089 9.97938C.107068 10.0142 .0679743 10.0598 .0410153 10.1126C.0140562 10.1654 0 10.2238 0 10.2831C0 10.3424 .0140562 10.4009 .0410153 10.4537C.0679743 10.5065 .107068 10.5521 .155089 10.5869C.335089 10.7969 .530089 10.7969 .740089 10.5869L5.49134 5.79438Z' fill='black'/%3E%3C/svg%3E%0A\");display:inline-block;width:12px;height:12px;background-repeat:no-repeat;background-size:auto 100%;background-position:left center}.promo-banner--homepage{padding-top:32px}.homepage-banner-offset-container::after{height:50%}#storyHighlights{padding:2rem}.body-display-v2.snowflake-quote-item-quote-text{line-height:28px!important}.snowflake-hero-system-headline .heading-1-v2{line-height:48px;font-size:54px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-content{flex-direction:row;justify-content:space-between;align-items:center;width:100%}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{flex-direction:row}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child)::before{content:\"|\";margin:0 6px}.sc-cert-banner{padding:40px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{margin:0!important;width:50%}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;padding-right:24px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:240px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{width:70%;padding-left:40px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{width:30%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important;display:flex}.summit-pricing-block__tile .snowflake-content-chip-content{display:flex;flex-direction:row;align-items:center;width:calc(100% - 200px)}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{position:absolute;top:50%;transform:translate(0,-50%);right:40px}.press-body\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:sticky;top:120px}.snowflake-mega-nav-navigation-title:hover{color:var(--ui-01)}}@media screen and (min-width:1024px){.about-snowflake{padding:28px}.about-snowflake__logo{max-width:none;padding:0 0 0 48px;margin-bottom:0}.hero--press .snowflake-hero-system-layout-70-30 .snowflake-hero-system-content-container{width:85%}.snowflake-hero-system{padding-bottom:var(--spacing-04);padding-top:var(--spacing-07)}.hero--press .display-2-v2{font-size:64px;line-height:56px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container{flex-direction:row;flex-wrap:nowrap;align-items:center}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:280px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;margin-bottom:0!important}#polarisNavItem{margin-top:40px}.snowflake-mega-nav-nav-item-description{line-height:18px!important}.snowflake-mega-nav-column-items{gap:var(--spacing-01);grid-gap:var(--spacing-01)}.snowflake-mega-nav-navigation-title{text-transform:none}}div[id*=blueIcon] .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01);padding:8px}div[id*=blueIcon]:hover .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01)!important}.snowflake-mega-nav-nav-item-icon__inner{border-radius:4px;background:var(--ui-background-05);padding:6px}.snowflake-mega-nav-nav-item:hover .snowflake-mega-nav-nav-item-icon__inner{background:#fff!important}.snowflake-mega-nav-nav-item-icon.snowflake-image-container{height:40px;width:40px}.snowflake-mega-nav-dropdown-footer-links\u003E.snowflake-button-link\u003E.snowflake-button-container{font-size:16px!important;font-family:Texta!important;font-weight:800!important}.snowflake-mega-nav-dropdown-footer-icon.snowflake-image-container{margin-right:8px;width:40px!important;height:40px!important}#viewAllCapabilities a:hover{background:0 0!important}#platformFooter .snowflake-title-v2 .snowflake-title-v2-line:last-child{font-family:Lato;font-size:14px;font-weight:500}#platformFooter .snowflake-mega-nav-dropdown-footer-links{flex-grow:1;justify-content:flex-end;align-items:center}#platformFooter .snowflake-mega-nav-dropdown-footer-content{flex-direction:row}#offset,#open-source{flex-direction:column;border-top:1px solid #ccc}#offset::before,#open-source::before{content:\" \";display:block;width:100%;font-weight:800!important;font-size:12px!important;line-height:14px;text-transform:uppercase;white-space:nowrap;margin-top:16px;margin-bottom:8px}#open-source::before{content:\"Open Source Technologies\"}.snowflake-mega-nav-dropdown-menu-close-button{margin:var(--spacing-04) 0 var(--spacing-03)}.snowflake-mega-nav-column{gap:var(--spacing-02)!important}.snowflake-mega-nav-nav-item\u003Ea{width:100%;margin-left:-8px;padding:8px;border-radius:4px}.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:var(--ui-background-05)}.snowflake-mega-nav-nav-item-description{margin-top:2px;display:block}#promobanner_overflowBottomDarkBlue::before{content:'';display:block;position:absolute;bottom:0;left:0;width:100%;height:50%;background:#212d35}#promobanner_overflowTopDarkBlue::before{content:'';display:block;position:absolute;top:0;left:0;width:100%;height:50%;background:#212d35}.overview-card\u003Ediv{box-shadow:0 0 14px 0 rgba(0,0,0,.10);background-color:#fff;border-radius:16px;overflow:hidden}.overview-card-text{padding:40px}.overview-card-image img{border-radius:0 !important}.overview-card-text h3,.overview-card-text .heading-3-v2{font-size:18px;line-height:1.1;margin-top:0}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"mega_header":{"additionalClasses":"heap-nav-header","layout":"SIMPLE","id":"container-c7d0f6c96e",":type":"snowflake-site/components/mega-header",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-72f2fbdf9e",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-baaf1f913b","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-dbd203d985",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-e2253b27fb",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-2c16d74215","additionalClasses":"nav-item__platform-parent is-platform","linkDescription":"Develop AI products, apps and more on a fully managed platform that securely connects businesses globally — across any type or scale of data.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/platform/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"The Snowflake Platform"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-d009c8f48d","additionalClasses":"nav-item nav-item--si is-si","linkDescription":"All your knowledge. One trusted enterprise agent.","flag":"NOW GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-cowork/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake CoWork"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_836345186":{"id":"nav-item-935f7b1e9e","additionalClasses":"blue-icon is-analytics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/analytics/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Analytics"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2":{"id":"nav-item-bf56e88108","additionalClasses":"blue-icon is-ai","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/ai/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_1314771042":{"id":"nav-item-1d1a86441a","additionalClasses":"blue-icon is-data-eng","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/data-engineering/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Data Engineering"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634":{"id":"nav-item-d82b364b2d","additionalClasses":"blue-icon is-apps-collab","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/applications-and-collaboration/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Applications & Collaboration"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_2013333117":{"id":"nav-item-41e0fed112","additionalClasses":"blue-icon is-transactions","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/transactions/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Transactions"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646","nav_item","nav_item_copy_copy_2_836345186","nav_item_copy_copy_2","nav_item_copy_copy_2_1314771042","nav_item_copy_144634","nav_item_copy_144634_2013333117"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"Featured Capabilities","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-d8983cab52",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-904aaec254","additionalClasses":"is-cortex-code","linkDescription":"Snowflake-native AI coding agent ","flag":"New","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-coco/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake CoCo"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-54e6147207","additionalClasses":"is-cortex-ai","linkDescription":"Instant access to industry-leading LLMs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/cortex/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Cortex AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590635":{"id":"nav-item-4c82ed0689","additionalClasses":"is-marketplace","linkDescription":"Third-party data sources connected within minutes","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/marketplace/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Marketplace"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-74c15aa874","additionalClasses":"is-snowpark","linkDescription":"Libraries and code execution environments that run Python and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/snowpark/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Snowpark"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_983061516":{"id":"nav-item-81de571f3b","additionalClasses":"is-streamlit","linkDescription":"Framework for transforming Python scripts into web apps","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/streamlit-in-snowflake/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Streamlit"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_212715","nav_item","nav_item_copy_660590635","nav_item_copy_660590","nav_item_copy_660590_983061516"]},"nav_column_692142673":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-a45e8ad882",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-ab71926a98","additionalClasses":"is-postgres","linkDescription":"Fully compatible open source Postgres running on Snowflake","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/postgres/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Postgres"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-8b4ac2796c","additionalClasses":"is-dcr","linkDescription":"Streamlined model development and MLOps from a centralized UI","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/end-to-end-ml-workflows/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake ML"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_212715":{"id":"nav-item-a2d908d295","additionalClasses":"is-openflow","linkDescription":"Effortless data movement for integrations","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/openflow/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Openflow"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-6c85ca22ed","additionalClasses":"is-notebooks","linkDescription":"Interactive dev environment for data and AI teams","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/notebooks/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Notebooks"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-24e66e8e8b","propertiesId":"workload-nav-1","additionalClasses":"is-native-apps","linkDescription":"End-to-end, Snowflake-native app creation and distribution","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/native-apps/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Native Apps"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_660590_1739526127","nav_item_copy_185565","nav_item_copy_212715","nav_item_copy_660590","nav_item_258535199"]},"nav_column_782221091":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-ff84e4bf09",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-aece4bf341","additionalClasses":"is-light-gray-icon is-horizon-catalog","linkDescription":"Universal AI catalog","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Horizon Catalog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1293798742":{"id":"nav-item-4378bac2f6","additionalClasses":"is-snowflake-ml","linkDescription":"Governed context layer that keeps AI, BI and data apps working from one truth","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon-context/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Horizon Context"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c":{"id":"nav-item-4e52123d7f","additionalClasses":"is-unistore","linkDescription":"Unify transactional and analytical workloads in Snowflake for enhanced simplicity","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/unistore/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Unistore"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1443811525":{"id":"nav-item-a3a87c9f00","additionalClasses":"is-observe","linkDescription":"AI-powered observability for faster production troubleshooting","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/observe/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Observe"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1006104884":{"id":"nav-item-be55c1da76","additionalClasses":"is-observe","linkDescription":"Use any engine on a single governed data copy","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/use-cases/interoperable-lakehouse/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Interoperable Lakehouse"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item_copy_660590_1293798742","nav_item_511717659_c","nav_item_511717659_c_1443811525","nav_item_511717659_c_1006104884"]}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_692142673","nav_column_782221091"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Product"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-fbb6cd7a6e","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-33b0b34a46",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-577e9aadbc",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-5173b6dfb0","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"All Industries"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-2d295d94ec","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/advertising-media-entertainment/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Advertising, Media & Entertainment"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-911a406122","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/financial-services/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Financial Services"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-d1c01aea96","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/healthcare-and-life-sciences/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Healthcare & Life Sciences"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1533429516":{"id":"nav-item-c2744fd440","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/manufacturing/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Manufacturing"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1444458226":{"id":"nav-item-e4a2640d4c","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/public-sector/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Public Sector"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1149488919":{"id":"nav-item-420d7b359a","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/retail-consumer-goods/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Retail & Consumer Goods"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_57417040":{"id":"nav-item-65f7e7cfea","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/technology/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Technology"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384674":{"id":"nav-item-b9030933e9","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/telecom/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Telecom"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384":{"id":"nav-item-779c037afc","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/travel-hospitality/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Travel & Hospitality"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_361384_2056203141","nav_item","nav_item_copy","nav_item_copy_1970515619","nav_item_copy_1533429516","nav_item_copy_1444458226","nav_item_copy_1149488919","nav_item_copy_57417040","nav_item_copy_361384674","nav_item_copy_361384"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-6e6e27506e",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-fb05cd077b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/finance/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Finance"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-4d98bd9145","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/information-technology/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"IT"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-b22b47475b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/marketing/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Marketing"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]},"nav_column_833417450":{"navColumnTitle":"Enablement Solutions","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-1bd4815260",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-9873fce8b9","linkDescription":"Confident migration to a unified platform","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/migrate-to-the-cloud/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Migrate to the AI Data Cloud"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_107772/icon.coreimg.svg/1723828484100/nav-icon-cloud.svg","alt":"Cloud icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-89c3bf8f32","linkDescription":"Snowflake experts to help you accelerate and achieve business goals","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/services-delivery/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Services Delivery"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_copy/icon.coreimg.svg/1768354429188/nav-icon--migrate.svg","alt":"Migrate icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_107772","nav_item_copy_copy"]},"nav_column_copy_copy":{"navColumnTitle":"PARTNER SOLUTIONS","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-3605b27c1a",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-a911cc191e","linkDescription":"Programs with product, solutions and cloud partners","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake Partner Network"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1723828498700/nav-icon--partner-network.svg","alt":"Partner Network icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-7cb0802090","linkDescription":"Partners, apps and solutions for enhanced deployment","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/all-partners/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Partner Finder"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1726173927645/nav-icon--partner-finder.svg","alt":"Partner Finder icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-d81cbdfc3d","linkDescription":"Live and virtual events","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/event-partnership-opportunities/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Event Partnership Opportunities"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy_1970515619/icon.coreimg.svg/1726173935655/nav-icon--events.svg","alt":"Calendar icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]}},":itemsOrder":["nav_column","nav_column_copy","nav_column_833417450","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Solutions"},"item_1719963657751_c":{"id":"nav-dropdown-menu-9469b36b42","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-970c500378",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-132a600ab4",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-f21ae47eb0","additionalClasses":"nav-item__platform-parent-why-sf","linkDescription":"Collaborate locally and globally to reveal new insights, create previously unforeseen business opportunities, and identify your customers with seamless experiences.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Why Snowflake"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","numberOfSubColumns":"two-columns","maxWidth":"1200","layout":"SIMPLE","id":"container-7793e00c85",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-01e0a1bf68","propertiesId":"testID","linkDescription":"Case studies and videos showcasing how global organizations use Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/customers/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Customers"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1739839279367/nav-icon--partner-network.svg","alt":"Customer icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-d1343ffe8d","propertiesId":"workload-nav-1","linkDescription":"Learn how to connect, share and integrate the data and apps on the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/what-is-data-cloud/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"The AI Data Cloud Explained"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_258535199/icon.coreimg.svg/1739840490955/nav-icon-cloud.svg","alt":"Cloud icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-5e555f57b1","linkDescription":"Comprehensive security through built-in features, robust cloud infrastructure protection, and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/snowflake-security-hub/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Security Hub"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565/icon.coreimg.svg/1758909528089/user-security-admins-ciso-icon.svg","alt":"User with security lock icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-fe3a3a9a31","additionalClasses":"is-light-gray-icon","linkDescription":"Maximize economic value through minimizing TCO and continuously optimizing price for performance","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/pricing-options/cost-and-performance-optimization/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Cost and Performance Optimization"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1758909542267/nav-icon-cost-optimization-performance.svg","alt":"Cost Optimization icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-96c119e191","linkDescription":"Startups building applications in the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/startup-program/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake for Startups"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565_903555964/icon.coreimg.svg/1758732224323/launch.svg","alt":"Launch","height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_258535199","nav_item_copy_185565","nav_item_copy","nav_item_copy_185565_903555964"]}},":itemsOrder":["nav_column","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Why Snowflake"},"item_1719961362824":{"id":"nav-dropdown-menu-31247986cf","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-dfe233b11e",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","layout":"SIMPLE","id":"container-6b458eb135",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-dcb3fca408","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Blog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_180298689":{"id":"nav-item-3a600f4308","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/events/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Events"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_1639361946":{"id":"nav-item-4f691a1eb4","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/support/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Support"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_680912746":{"id":"nav-item-70ba70a8b9","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/contact/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Contact us"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_180298689","nav_item_1639361946","nav_item_680912746"]},"nav_column_44600420__826130542":{"navColumnTitle":"Learn","numberOfSubColumns":"two-columns","layout":"SIMPLE","id":"container-efd48372c5",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-727c8ba5de","linkDescription":"Ebooks, videos, white papers and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Resource Library"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy/icon.coreimg.svg/1736877128196/nav-icon--notebooks.svg","alt":"Notebooks icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-32fcd5e2f1","linkDescription":"Overview of Snowflake's educational offerings","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/training/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Training"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item/icon.coreimg.svg/1722385094416/nav-icon--training.svg","alt":"Training icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-8bb75d9b94","linkDescription":"Expert-led discussions and demos across industries and use cases","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Webinars"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_144634_1984107859/icon.coreimg.svg/1759424691990/nav-icon--webinars.svg","alt":"Webinars icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-a9f988db80","linkDescription":"Snowflake's technical industry professional certifications","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/certifications/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Certifications"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_1438098918/icon.coreimg.svg/1722382780833/nav-icon--cert.svg","alt":"Certification icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-76b84d77fe","linkDescription":"Weekly product demos showcasing key features and live Q&A ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/demo/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Live Demos"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_143809/icon.coreimg.svg/1759424359543/nav-icon--live-demo.svg","alt":"Live Demo icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-b2c1358834","linkDescription":"Training courses for all levels, on-demand or instructor-led","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://learn.snowflake.com/en/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Snowflake University"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890638/icon.coreimg.svg/1722382769808/nav-icon--education.svg","alt":"Education icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-b5ef3db6c2","linkDescription":"Instructor-led virtual workshops for exploring key Snowflake features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/virtual-hands-on-lab/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Hands-On Labs"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_189945/icon.coreimg.svg/1759388182903/nav-icon--labs.svg","alt":"Hands-on Labs icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-7766e73a2c","linkDescription":"Academic papers written by Snowflake researchers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/publications/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake Research Publications"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890/icon.coreimg.svg/1756326371387/copy.svg","alt":"Copy","height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-e8583a6b75","linkDescription":"Informative articles about AI and data topics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/fundamentals/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Fundamentals"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890_930852828/icon.coreimg.svg/1756853637155/data-sheet.svg","alt":"Document with list","height":"64","width":"65",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item","nav_item_copy_144634_1984107859","nav_item_copy_1438098918","nav_item_copy_143809","nav_item_copy_333890638","nav_item_copy_189945","nav_item_copy_333890","nav_item_copy_333890_930852828"]}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"]},"nav_promo_section":{"id":"nav-promo-section-6347f7405f","experience_fragment_1":{"id":"experiencefragment-0420149978","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master1/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-d5d88b2738",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-679f9028fa","openInNewWindow":true,"layout":"horizontal","headline":"The Modern Marketing Data Stack 5th Edition","description":"AI agents are changing the marketing stack. See how to govern the shift. ","linkTitle":"Learn more","linkUrl":"/en/the-modern-marketing-data-stack-report/","image":{"id":"image","lazyEnabled":true,"src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--b3030d24-fd50-45e6-bfe6-9520d3eb46d8/web-inside-the-mmds-5th-960x540.png?preferwebp=true&quality=85","alt":"MMDS report 5th edition","height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-aae56cc6bb","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-2/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-de6242f75c",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-f114e92c64","openInNewWindow":true,"layout":"horizontal","headline":"The ROI of Gen AI and Agents 2026","description":"Discover how 92% of early adopters are achieving positive ROI with gen AI.","linkTitle":"Learn More","linkUrl":"/en/lp/radical-roi-generative-ai/","image":{"id":"image","lazyEnabled":true,"src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--0c15edae-1a97-4739-8b16-c7f3941a6d9e/web-roi-of-gen-ai-and-agents-2026-r02-960x540.png?preferwebp=true&quality=85","alt":"roi of gen ai and agents","height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_3":{"id":"experiencefragment-0d1348b95f","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-3/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-b955b32f1c",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-381820ef95","openInNewWindow":true,"layout":"horizontal","headline":"Startup 2026: AI Agents Mean Business","description":"Venture leaders weigh in on agentic AI. ","linkTitle":"Learn more","linkUrl":"/en/lp/building-startup-ai-age/","image":{"id":"image","lazyEnabled":true,"src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a320b404-dca1-4477-b033-c79708538657/web-startup-2026-960x540.png?preferwebp=true&quality=85","alt":"alt","height":"540","width":"960",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Resources"},"item_1719963657751":{"id":"nav-dropdown-menu-f31109d060","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-5143e3cfc5",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-d4164d4dd5",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-29db8814bd","propertiesId":"testID","linkDescription":"Overview of the dev resources you need to build and scale","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Snowflake for Developers"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1731362494574/nav-icon--devs.svg","alt":"Developers icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-11e91bf4dc","linkDescription":"Reference architectures, use cases and best practices","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/guides/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Developer Guides"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy_1855651246/icon.coreimg.svg/1761677891705/nav-icon--solution-center.svg","alt":"Solution Center icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-5c72fa6ae4","additionalClasses":"is-light-gray-icon","linkDescription":"The latest software versions, drivers, libraries and relevant docs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/downloads/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Downloads"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1731362660050/nav-icon-download.svg","alt":"Download icon","height":"28","width":"28",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246","nav_item_copy"]},"nav_column_copy_copy_1367930678":{"navColumnTitle":"Learn","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-db090982b2",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-1de82585d5","propertiesId":"testID","linkDescription":"Reference docs, guides, tutorials and announcements","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://docs.snowflake.com/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Documentation"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item/icon.coreimg.svg/1731361950527/nav-icon--docs.svg","alt":"Docs icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-ae6782e2ef","additionalClasses":"is-light-gray-icon","linkDescription":"Key projects Snowflake engineers maintain and support","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/open-source/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Open Source"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy/icon.coreimg.svg/1731365437016/nav-icon-open-source.svg","alt":"Open Source icon","height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-ab64ea0e66","additionalClasses":"is-light-gray-icon","linkDescription":"Online and in-person classes and workshops to upskill on Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/northstar/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Builder Education"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy_copy/icon.coreimg.svg/1731362475640/nav-icon--northstar.svg","alt":"Northstar logo","height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_copy"]},"nav_column_copy_copy_1101894776":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-36310dbf8b",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-ceda640028","propertiesId":"testID","linkDescription":"Snowflake’s technical leaders on what, why and how they build features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/engineering-blog/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Engineering Blog"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item/icon.coreimg.svg/1757101368571/nav-icon--developer-center.svg","alt":"Developers icon","height":"32","width":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-8542825e7a","linkDescription":"Tips, tricks and discussion with fellow Snowflake developers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://community.snowflake.com/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Community"},"icon":{"id":"icon","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item_copy_1855651246/icon.coreimg.svg/1731362644348/nav-icon--partner-network.svg","alt":"Partner Network icon","height":"64","width":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246"]}},":itemsOrder":["nav_column_copy_copy","nav_column_copy_copy_1367930678","nav_column_copy_copy_1101894776"]},"nav_promo_section":{"id":"nav-promo-section-7bac1df320","experience_fragment_1":{"id":"experiencefragment-4a2a8dab78","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-5/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-f5fd5b7d43",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-53a422c061","openInNewWindow":false,"layout":"horizontal","headline":"Get started with your first Snowflake Notebook","description":"Write and execute code, visualize results, and tell the story of your analysis all in one place.","linkTitle":"Learn More","linkUrl":"/en/developers/solutions-center/getting-started-with-your-first-snowflake-notebook-project/","image":{"id":"image","lazyEnabled":true,"src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--dc7e334a-c38b-4283-b1de-fcf829952eef/nav-promo-first-notebook.jpg?preferwebp=true&quality=85","alt":"alt","height":"210","width":"415",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-1485915695","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-a7b81d7660",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-5141a634c2","openInNewWindow":true,"layout":"horizontal","headline":"Northstar Builder Workshops","description":"Join other developers as you roll up your sleeves and explore the possibilities of Snowflake.","linkTitle":"Learn More","linkUrl":"/en/nav-promos/northstar-builders-workshop/","image":{"id":"image","lazyEnabled":true,"src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14341ced-bc5e-4a29-9762-b7857f6cadfc/nav-promo-northstar.jpg?preferwebp=true&quality=85","alt":"Snowflake Northstar logo","height":"700","width":"1440",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Developers"},"item_1718247180324":{"id":"nav-dropdown-menu-9f14b9c00e","enableDropdown":false,"link_url":"/en/pricing-options/",":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Pricing"}},":itemsOrder":["item_1719963657751_c_663444255","nav_dropdown_menu_2","item_1719963657751_c","item_1719961362824","item_1719963657751","item_1718247180324"]},"languagenavigation":{"id":"language-navigation-4d50a0f01f","languageNavItems":[{"title":"English","path":"/en/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/","locale":"en","active":true},{"title":"日本語","path":"/ja/","locale":"ja","active":false},{"title":"한국어","path":"/ko/","locale":"ko","active":false},{"title":"中文（简体）","path":"/zh_cn/","locale":"zh-cn","active":false},{"title":"Português","path":"/pt_br/","locale":"pt-br","active":false},{"title":"Deutsch","path":"/de/","locale":"de","active":false},{"title":"Français","path":"/fr/","locale":"fr","active":false},{"title":"Español","path":"/es/","locale":"es","active":false},{"title":"Italiano","path":"/it/","locale":"it","active":false}],":type":"snowflake-site/components/nav/language-navigation"},"button_1177328691":{"id":"button-239034dc78","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL","text":"Sign in"},"button":{"id":"button-2539852ff9","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_INTERNAL","text":"CONTACT SALES"},"button_288358396":{"id":"button-00b7a883a5","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","linkType":"SNOWFLAKE_EXTERNAL","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"],"appliedCssClassNames":"snowflake-header-container white"}},":itemsOrder":["markup_editor","mega_header"]},"image":{":type":"nt:unstructured"},"cq:targetMetadata":{"cq:targetStatus":"OUT_OF_SYNC","cq:exportTime":1781280015540,"cq:targetOfferId":860250,":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:targetMetadata"],"classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-0288b3301a","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-e01b5cad51","isDeveloperGuidesPage":false,"quickstartHeroFirstCertifiedTag":{"tagText":"Quickstart","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/quickstart","tagIcon":""},"quickstartHeroTitle":{"lines":["Getting Started with Time Series Analytics for IoT in Snowflake"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroAuthor":"nathan.birch@snowflake.com","quickstartHeroFirstSnowflakeFeatureTag":{"tagText":"Time Series Functions","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/snowflake-feature/time-series-functions","tagIcon":""},"quickstartHeroForkRepoLink":{"id":"button-35218d089d","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks"},"linkTargetContentType":"GENERIC",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_EXTERNAL","text":"Fork Repo"},"quickstartHeroBreadcrumbs":[{"title":"Getting Started with Time Series Analytics for IoT in Snowflake","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks","currentPage":true},{"title":"Guides","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides","currentPage":false},{"title":"Snowflake for Developers","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers","currentPage":false}],"fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks",":type":"snowflake-site/components/quickstart/quickstart-hero"},"flexible_column_cont":{"id":"flexible-column-container-747f860220","propertiesId":"quickstart-template-main-flexible-container","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-0666b98ebb",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-bf586be203","paragraphs":["&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EOverview\u003C/h2\u003E\n","\u003Cp\u003ESnowflake offers a rich set of functionalities for \u003Cstrong\u003ETime Series Analytics\u003C/strong\u003E making it a performant and cost effective platform for bringing in your time series workloads. This quickstart lab covers a real world scenario of ingesting, analyzing and visualizing IOT time series data.\u003C/p\u003E\n","\u003Ch3\u003EWhat You'll Learn\u003C/h3\u003E\n","\u003Cp\u003EUpon completing this quickstart lab, you will have learned how to perform time series analytics in Snowflake, and will have gained practical experience in several areas:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESetup a streaming ingestion\u003C/strong\u003E client to to stream time series data into Snowflake using Snowpipe Streaming\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EModel and transform\u003C/strong\u003E the streaming time series data using Dynamic Tables\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EAnalyzing the data\u003C/strong\u003E using native time series functions\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EBuilding your own time series functions\u003C/strong\u003E using Snowpark UDFs when necessary\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDeploying a Streamlit application\u003C/strong\u003E for visualizing and analyzing time series data\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/overview_architecture.png\" alt=\"assets/overview_architecture.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EWhat You'll Build\u003C/h3\u003E\n","\u003Cp\u003EBy the end of this lab you will have an \u003Cstrong\u003Eend-to-end streaming Time Series Analysis solution\u003C/strong\u003E, with a front-end application deployed using \u003Cstrong\u003EStreamlit in Snowflake\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_summary.gif\" alt=\"assets/streamlit_video_summary.gif\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EWhat You'll Need\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EA supported Snowflake \u003Ca href=\"https://docs.snowflake.com/en/user-guide/setup#browser-requirements\"\u003EBrowser\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://signup.snowflake.com/?utm_source=snowflake-devrel&amp;utm_medium=developer-guides&amp;lab=getting_started_with_time_series_using_snowflake_streaming_sis_ml_notebooks&amp;utm_cta=developer-guides\"\u003ESign-up for a Snowflake Trial\u003C/a\u003E OR have access to an existing Snowflake account with the ACCOUNTADMIN role. Select the Enterprise edition, AWS as a cloud provider.\u003C/li\u003E\u003Cli\u003EAccess to a \u003Cstrong\u003Epersonal \u003Ca href=\"https://github.com/signup\"\u003EGitHub\u003C/a\u003E account\u003C/strong\u003E to fork the quickstart repo and create \u003Ca href=\"https://docs.github.com/en/codespaces/overview\"\u003EGitHub Codespaces\u003C/a\u003E. Codespaces offer a hosted development environment. GitHub offers \u003Ca href=\"https://github.com/features/codespaces\"\u003Efree Codespace hours each month\u003C/a\u003E when using a 2 or 4 node environment, which should be enough to work through this lab.\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIt is recommended to use a personal GitHub account which will have permissions to deploy a GitHub Codespace.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ELab Setup\u003C/h2\u003E\n","\u003Ch3\u003EStep 1 - Fork the Lab GitHub Repository\u003C/h3\u003E\n","\u003Cp\u003EThe first step is to create a fork of the Lab GitHub repository.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EIn a web browser log into your \u003Ca href=\"https://github.com/\"\u003EGithub\u003C/a\u003E account.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen \u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks\"\u003EGetting Started with Time Series Analytics for IoT in Snowflake associated GitHub Repository\u003C/a\u003E.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThis repository contains all the code you need to successfully complete this quickstart guide.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EClick on the \u003Cstrong\u003E&quot;Fork&quot;\u003C/strong\u003E button near the top right.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_fork.png\" alt=\"assets/labsetup_fork.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003EClick \u003Cstrong\u003E&quot;Create Fork&quot;\u003C/strong\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_createfork.png\" alt=\"assets/labsetup_createfork.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 2 - Deploy a GitHub Codespace for the Lab\u003C/h3\u003E\n","\u003Cp\u003ENow create the GitHub Codespace.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EClick on the green \u003Ccode\u003E&lt;&gt; Code\u003C/code\u003E button from the GitHub repository homepage.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIn the Code popup, click on the \u003Ccode\u003ECodespaces\u003C/code\u003E tab.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EClick \u003Ccode\u003ECreate codespace on main\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_createcodespace.png\" alt=\"assets/labsetup_createcodespace.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIf you are seeing the message \u003Cstrong\u003ECodespace access limited\u003C/strong\u003E, you may be logged into Github with an organization account. Please \u003Ca href=\"https://github.com/signup\"\u003ESign up to GitHub\u003C/a\u003E using a personal account and retry the \u003Cstrong\u003ELab Setup\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_codespace_limited.png\" alt=\"assets/labsetup_codespace_limited.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThis will open a new browser window and begin \u003Cstrong\u003ESetting up your codespace\u003C/strong\u003E. The Github Codespace deployment will take several minutes to set up the entire environment for this lab.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_setupcodespace.png\" alt=\"assets/labsetup_setupcodespace.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPlease wait\u003C/strong\u003E for the \u003Cstrong\u003EpostCreateCommand\u003C/strong\u003E to run. It may take 5-10 mins to fully deploy.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIgnore any notifications\u003C/strong\u003E that may prompt to refresh the Codespace, these will disappear once the postCreateCommand has run.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_postcreate.png\" alt=\"assets/labsetup_postcreate.png\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EINFO: Github Codespace Deployment Summary\u003C/h4\u003E\n","\u003Cp\u003EOnce complete you should see a hosted web-based version of \u003Cstrong\u003EVS Code Integrated Development Environment (IDE)\u003C/strong\u003E in your browser with your forked repository.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscode.png\" alt=\"assets/labsetup_vscode.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe Github Codespace deployment will contain all the resources needed to complete the lab\u003C/strong\u003E.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIf you do not see the \u003Cstrong\u003ESnowflake VS Code Extension\u003C/strong\u003E try \u003Cstrong\u003ERefreshing\u003C/strong\u003E your browser window.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 3 - Verify Your Anaconda Environment is Activated\u003C/h3\u003E\n","\u003Cp\u003EDuring the Codespace setup the postCreateCommand script created an Anaconda virtual environment named \u003Cstrong\u003Ehol-timeseries\u003C/strong\u003E. This virtual environment contains the packages needed to connect and interact with Snowflake using the \u003Cstrong\u003ESnowflake CLI\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003ETo activate the virtual environment:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ERemove any existing open Terminal by clicking the \u003Ccode\u003EKill Terminal\u003C/code\u003E button\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_killterminal.png\" alt=\"assets/labsetup_killterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EOpen \u003Ccode\u003EMenu &gt; Terminal &gt; New Terminal\u003C/code\u003E - a new terminal window will now open\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png\" alt=\"assets/labsetup_newterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EEnter command \u003Ccode\u003Econda activate hol-timeseries\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png\" alt=\"assets/labsetup_condaactivate.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png\" alt=\"assets/labsetup_condaactivated.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThe terminal prompt should now show a prefix \u003Ccode\u003E(hol-timeseries)\u003C/code\u003E to confirm the \u003Cstrong\u003Ehol-timeseries\u003C/strong\u003E virtual environment is activated.\u003C/p\u003E\n","\u003Ch3\u003EStep 4 - Update Snowflake Connection Account Identifiers in Lab Files\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ELogin to your Snowflake account using a browser\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFrom the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\u003Cstrong\u003EIn the new worksheet\u003C/strong\u003E, execute the following command that uses \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/system_allowlist\"\u003ESYSTEM$ALLOWLIST\u003C/a\u003E to find your \u003Cstrong\u003EACCOUNT_IDENTIFIER\u003C/strong\u003E:\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT REPLACE(AL.VALUE:host::VARCHAR, '.snowflakecomputing.com', '') AS ACCOUNT_IDENTIFIER\nFROM TABLE(FLATTEN(input =&gt; PARSE_JSON(SYSTEM$ALLOWLIST()))) AS AL\nWHERE AL.VALUE:type::VARCHAR = 'SNOWFLAKE_DEPLOYMENT_REGIONLESS';\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003EIn the results returned, below the command, select the row returned, and \u003Cstrong\u003ECopy\u003C/strong\u003E the \u003Cstrong\u003EACCOUNT_IDENTIFIER\u003C/strong\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_regionless.png\" alt=\"assets/labsetup_regionless.png\"\u003E\u003C/p\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003EBack in \u003Cstrong\u003EVS Code\u003C/strong\u003E, navigate to the following files and in the files replace \u003Cstrong\u003E&lt;ACCOUNT_IDENTIFIER&gt;\u003C/strong\u003E with your Snowflake account identifier value:\u003C/li\u003E\u003C/ol\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003E.snowflake/config.toml\u003C/code\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003Eaccount\u003C/strong\u003E variable for \u003Cstrong\u003Eboth\u003C/strong\u003E connections\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_files_snowflakeconfig.png\" alt=\"assets/labsetup_files_snowflakeconfig.png\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003Eiotstream/snowflake.properties\u003C/code\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003Eaccount\u003C/strong\u003E variable\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003Ehost\u003C/strong\u003E variable\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_files_iotstreamproperties.png\" alt=\"assets/labsetup_files_iotstreamproperties.png\"\u003E\u003C/p\u003E\n\u003Col start=\"7\"\u003E\u003Cli\u003E\u003Cstrong\u003ESave\u003C/strong\u003E file changes by pressing \u003Ccode\u003ECommand/Ctrl\u003C/code\u003E and \u003Ccode\u003ES\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003EStep 5 - Configure Snowflake VS Code Extension Connection\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003EOpen the \u003Cstrong\u003ESnowflake VS Code Extension\u003C/strong\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension.png\" alt=\"assets/labsetup_vscodeextension.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EFor \u003Cstrong\u003EAccount Identifier/URL\u003C/strong\u003E, enter your \u003Cstrong\u003E&lt;ACCOUNT_IDENTIFIER&gt;\u003C/strong\u003E, \u003Cstrong\u003Ewithout\u003C/strong\u003E the \u003Ccode\u003E.snowflakecomputing.com\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003EContinue\u003C/strong\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowextension.png\" alt=\"assets/labsetup_snowextension.png\"\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EFor Auth Method select \u003Ccode\u003EUsername/password\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EFor Username enter the \u003Cstrong\u003EACCOUNTADMIN user\u003C/strong\u003E (defined when setting up the Snowflake account)\u003C/li\u003E\u003Cli\u003EFor Password enter the \u003Cstrong\u003EACCOUNTADMIN password\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003EClick \u003Ccode\u003ESign in\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowsignin.png\" alt=\"assets/labsetup_snowsignin.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe VS Code Snowflake Extension\u003C/strong\u003E should now be connected to your Snowflake. \u003Cstrong\u003EOnce connected\u003C/strong\u003E, it will show a \u003Ccode\u003ESign Out\u003C/code\u003E button along with \u003Cstrong\u003EDatabases\u003C/strong\u003E and \u003Cstrong\u003EApplications\u003C/strong\u003E in the \u003Ccode\u003EOBJECT EXPLORER\u003C/code\u003E section.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowconnected.png\" alt=\"assets/labsetup_snowconnected.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 6 - Expand Snowflake Worksheets Folder\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWorksheets\u003C/strong\u003E have been provided for the next sections, these can be accessed by going to \u003Cstrong\u003EVS Code Explorer\u003C/strong\u003E and expanding the \u003Ccode\u003Eworksheets\u003C/code\u003E folder.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_worksheet1.png\" alt=\"assets/labsetup_worksheet1.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EWe'll need to update the \u003Cstrong\u003Esetup worksheet\u003C/strong\u003E with your \u003Cstrong\u003EPUBLIC KEY\u003C/strong\u003E to be used during the initial Snowflake setup.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 7 - Retrieve the Snowflake Public Key\u003C/h3\u003E\n","\u003Cp\u003EAs part of the GitHub Codespace setup, an \u003Cstrong\u003EOpenSSL Private Key-pair\u003C/strong\u003E will be generated in the \u003Cstrong\u003EVS Code\u003C/strong\u003E \u003Ccode\u003Ekeys\u003C/code\u003E directory.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECopy\u003C/strong\u003E the \u003Cstrong\u003EPUBLIC KEY\u003C/strong\u003E value from the \u003Ccode\u003Ekeys/rsa_key.pub\u003C/code\u003E file. This will be needed in the setup worksheet.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EOnly the \u003Cstrong\u003EPUBLIC KEY\u003C/strong\u003E value is required, which is the section \u003Cstrong\u003Ebetween\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Ccode\u003E-----BEGIN PUBLIC KEY-----\u003C/code\u003E and \u003Ccode\u003E-----END PUBLIC KEY-----\u003C/code\u003E\u003C/p\u003E\n","\u003Cp\u003Eensure you \u003Cstrong\u003EDO NOT\u003C/strong\u003E copy these lines.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_publickey.png\" alt=\"assets/labsetup_publickey.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EGitHub Codespace\u003C/strong\u003E may prompt to access the clipboard in \u003Cstrong\u003EVSCode\u003C/strong\u003E, select \u003Cstrong\u003EAllow\u003C/strong\u003E if prompted.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_codespace_paste.png\" alt=\"assets/streamlit_codespace_paste.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 8 - Update Snowflake &quot;Setup&quot; Worksheet with Lab Provisioned PUBLIC KEY\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EOpen worksheet: \u003Ccode\u003Eworksheets/hol_timeseries_1_setup.sql\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFind and replace\u003C/strong\u003E the \u003Cstrong\u003E&lt;RSA_PUBLIC_KEY&gt;\u003C/strong\u003E with the \u003Cstrong\u003EPUBLIC KEY\u003C/strong\u003E copied from the \u003Ccode\u003Ekeys/rsa_key.pub\u003C/code\u003E file.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_rsakey.png\" alt=\"assets/labsetup_rsakey.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENOTE:\u003C/strong\u003E The pasted \u003Cstrong\u003EPUBLIC KEY\u003C/strong\u003E can show on multiple lines and will work.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENO NEED TO RUN\u003C/strong\u003E anything just yet, this is just setup, this worksheet will be run in the next section.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ESnowflake setup\u003C/strong\u003E is complete, and The Lab environment is configured!\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ELab Troubleshooting\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUnder some sections of the lab, Troubleshooting steps have been provided to assist with any issues that may occur\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003EIn the event that you experience issues in a particular section, refer to the \u003Cstrong\u003ETroubleshooting\u003C/strong\u003E steps where provided.\u003C/p\u003E\n","\u003Cp\u003EPlease use the following steps to \u003Cstrong\u003Edownload the lab files locally\u003C/strong\u003E for reference, and in case of the GitHub Codespace not deploying.\u003C/p\u003E\n","\u003Ch4\u003EDownload and Extract Lab Files\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDownload\u003C/strong\u003E Lab Files: &lt;button&gt;\u003Ca href=\"https://github.com/Snowflake-Labs/sfguide-getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/archive/refs/heads/main.zip\"\u003EGetting Started with Time Series Analytics for IoT in Snowflake\u003C/a\u003E&lt;/button&gt;\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EExtract the \u003Cstrong\u003Elab downloaded files\u003C/strong\u003E to an accessible location on your computer.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EThe lab will refer to the extracted \u003Cstrong\u003Elab downloaded files\u003C/strong\u003E as \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESetup Snowflake Resources\u003C/h2\u003E\n","\u003Ch4\u003ECreate the Foundational Snowflake Objects for this Lab\u003C/h4\u003E\n","\u003Cp\u003EThis includes:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ERole: \u003Cstrong\u003EROLE_HOL_TIMESERIES\u003C/strong\u003E - role used for working throughout the lab\u003C/li\u003E\u003Cli\u003EUser: \u003Cstrong\u003EUSER_HOL_TIMESERIES\u003C/strong\u003E - the user to connect to Snowflake\u003C/li\u003E\u003Cli\u003EWarehouses:\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EHOL_TRANSFORM_WH\u003C/strong\u003E - warehouse used for transforming ingested data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EHOL_ANALYTICS_WH\u003C/strong\u003E - warehouse used for analytics\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EDatabase: \u003Cstrong\u003EHOL_TIMESERIES\u003C/strong\u003E - main database to store all lab objects\u003C/li\u003E\u003Cli\u003ESchemas:\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESTAGING\u003C/strong\u003E - RAW data source landing schema\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETRANSFORM\u003C/strong\u003E - transformed and modeled data schema\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EANALYTICS\u003C/strong\u003E - serving and analytics functions schema\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EGrants: Access control grants for role \u003Cstrong\u003EROLE_HOL_TIMESERIES\u003C/strong\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowsetup_architecture.png\" alt=\"assets/snowsetup_architecture.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 1 - Run Snowflake Setup Worksheet\u003C/h3\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E open worksheet: \u003Ccode\u003Eworksheets/hol_timeseries_1_setup.sql\u003C/code\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Snowflake VS Code Extension\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ESnowflake VS Code Extension\u003C/strong\u003E will detect \u003Cstrong\u003Eexecutable statement\u003C/strong\u003E lines within a worksheet. You can choose to run all or specific statements.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EExecute All Statements\u003C/strong\u003E: To run the worksheet in full, select the \u003Ccode\u003EExecute All Statements\u003C/code\u003E button at the top right of the worksheet.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runall.png\" alt=\"assets/labsetup_vscodeextension_runall.png\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EMultiple Statements\u003C/strong\u003E: Highlighting / selecting the statements you want to run, and pressing \u003Cstrong\u003ECommand/Ctrl\u003C/strong\u003E and \u003Cstrong\u003EEnter\u003C/strong\u003E.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runmulti.png\" alt=\"assets/labsetup_vscodeextension_runmulti.png\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EIndividual Statements\u003C/strong\u003E: Click the \u003Ccode\u003EExecute\u003C/code\u003E link above each statement line.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowsetup_vscode_execute.png\" alt=\"assets/snowsetup_vscode_execute.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExecuted statements\u003C/strong\u003E will show in the \u003Cstrong\u003EQUERY HISTORY\u003C/strong\u003E tab of the Snowflake VS Code Extension.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_queryhistory.png\" alt=\"assets/labsetup_vscodeextension_queryhistory.png\"\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003ERun the Worksheet to get Snowflake Resources Created\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAs the worksheet has been set up during the &quot;Lab Setup&quot; section, click\u003C/strong\u003E \u003Ccode\u003EExecute All Statements\u003C/code\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runall.png\" alt=\"assets/labsetup_vscodeextension_runall.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThis section will run using the \u003Cstrong\u003EACCOUNTADMIN\u003C/strong\u003E role and login setup via \u003Cstrong\u003ESnowflake VS Code Extension\u003C/strong\u003E connection.\u003C/p\u003E\n","\u003Cp\u003EThere is an \u003Cstrong\u003EEXTERNAL ACTIVITY\u003C/strong\u003E section in the worksheet, which was already done as part of \u003Cstrong\u003E&quot;Lab Setup&quot;\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##### SNOWFLAKE SETUP SCRIPT #####*/\n\n-- Login and assume ACCOUNTADMIN role\nUSE ROLE ACCOUNTADMIN;\n\n-- Create lab role\nCREATE ROLE IF NOT EXISTS ROLE_HOL_TIMESERIES;\nGRANT ROLE ROLE_HOL_TIMESERIES TO ROLE SYSADMIN;\n\n-- Create lab user\nCREATE OR REPLACE USER USER_HOL_TIMESERIES DEFAULT_ROLE = &quot;ROLE_HOL_TIMESERIES&quot;\nCOMMENT = &quot;HOL Time Series user.&quot;;\nGRANT ROLE ROLE_HOL_TIMESERIES TO USER USER_HOL_TIMESERIES;\n\n/*###### EXTERNAL ACTIVITY #####\nA public key is setup in Github Codespace VS Code environment: keys/rsa_key.pub\n\nRetrieve the public key detail and replace &lt;RSA_PUBLIC_KEY&gt;\nwith the contents of the public key excluding\nthe -----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY----- lines\n##############################*/\n\n-- Assign lab user public key\nALTER USER USER_HOL_TIMESERIES SET RSA_PUBLIC_KEY='&lt;RSA_PUBLIC_KEY&gt;';\n\n-- Setup HOL infrastructure objects\n-- Assume the SYSADMIN role\nUSE ROLE SYSADMIN;\n\n-- Create a TRANSFORM WH - used for ingest and transform activity\nCREATE WAREHOUSE IF NOT EXISTS HOL_TRANSFORM_WH WITH WAREHOUSE_SIZE = XSMALL\nAUTO_SUSPEND = 60 AUTO_RESUME = TRUE INITIALLY_SUSPENDED = TRUE\nCOMMENT = 'Transform Warehouse' ENABLE_QUERY_ACCELERATION = TRUE;\n\n-- Create an Analytics WH = used for analytics and reporting\nCREATE WAREHOUSE IF NOT EXISTS HOL_ANALYTICS_WH WITH WAREHOUSE_SIZE = XSMALL\nAUTO_SUSPEND = 60 AUTO_RESUME = TRUE INITIALLY_SUSPENDED = TRUE\nCOMMENT = 'Analytics Warehouse' ENABLE_QUERY_ACCELERATION = TRUE;\n\n\n-- Create HOL Database\nCREATE DATABASE IF NOT EXISTS HOL_TIMESERIES COMMENT = 'HOL Time Series database.';\n\n\n-- HOL Schemas\n-- Create STAGING schema - for RAW data\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.STAGING WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series STAGING schema.';\n\n-- Create TRANSFORM schema - for modeled data\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.TRANSFORM WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series TRANSFORM schema.';\n\n-- Create ANALYTICS schema - for serving analytics\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.ANALYTICS WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series ANALYTICS schema.';\n\n\n-- Grant HOL role access to lab resources\n-- Assign database grants to lab role\nGRANT USAGE ON DATABASE HOL_TIMESERIES TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Assign Warehouse grants to lab role\nGRANT ALL ON WAREHOUSE HOL_TRANSFORM_WH TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON WAREHOUSE HOL_ANALYTICS_WH TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Assign schema grants to lab role\nGRANT ALL ON SCHEMA HOL_TIMESERIES.STAGING TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON SCHEMA HOL_TIMESERIES.TRANSFORM TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Cortex ML Functions\nGRANT CREATE SNOWFLAKE.ML.ANOMALY_DETECTION ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT CREATE SNOWFLAKE.ML.FORECAST ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Notebooks\nGRANT CREATE NOTEBOOK ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n/*##### SNOWFLAKE SETUP SCRIPT #####*/\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThe Snowflake foundation objects have now been deployed, and we can continue on to set up a \u003Cstrong\u003ESnowpipe Streaming Ingestion\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EThis section runs through a \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E, this can be run in Snowflake with a \u003Cstrong\u003ESnowsight Worksheet\u003C/strong\u003E. Use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EInside the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E folder open \u003Ccode\u003Eworksheets/hol_timeseries_1_setup.sql\u003C/code\u003E and \u003Cstrong\u003Ecopy\u003C/strong\u003E the contents of the file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPaste\u003C/strong\u003E the copied content into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun\u003C/strong\u003E all the commands in the worksheet.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ESnowpipe Streaming Ingestion\u003C/h2\u003E\n","\u003Cp\u003EWith the foundational objects setup, we can now \u003Cstrong\u003Edeploy a staging table\u003C/strong\u003E to stream time series data into Snowflake via a Snowpipe Streaming client.\u003C/p\u003E\n","\u003Cp\u003EFor this lab a \u003Cstrong\u003EJava IOT Simulator Client\u003C/strong\u003E application has been created to stream IoT sensor readings into Snowflake.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_streamingest.png\" alt=\"assets/snowpipe_streamingest.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 1 - Create Streaming Staging Table\u003C/h3\u003E\n","\u003Cp\u003EWe'll create a stage loading table to stream RAW time series data into Snowflake. This will be located in the \u003Cstrong\u003ESTAGING\u003C/strong\u003E schema of the \u003Cstrong\u003EHOL_TIMESERIES\u003C/strong\u003E database.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_stagetable.png\" alt=\"assets/snowpipe_stagetable.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E open worksheet: \u003Ccode\u003Eworksheets/hol_timeseries_2_ingest.sql\u003C/code\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ERun the \u003Cstrong\u003EStaging Table\u003C/strong\u003E script to create the IoT stream staging table.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- Staging Table - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.STAGING;\nUSE WAREHOUSE HOL_TRANSFORM_WH;\n\n-- Setup staging tables - RAW_TS_IOTSTREAM_DATA\nCREATE OR REPLACE TABLE HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA (\n    RECORD_METADATA VARIANT,\n    RECORD_CONTENT VARIANT\n)\nCHANGE_TRACKING = TRUE\nCOMMENT = 'IOTSTREAM staging table.'\n;\n\n/*##############################\n-- Staging Table - END\n##############################*/\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe IoT data will be streamed into Snowflake in a similar \u003Ca href=\"https://docs.snowflake.com/en/user-guide/kafka-connector-overview#schema-of-tables-for-kafka-topics\"\u003Eschema format as Kafka\u003C/a\u003E which contains two columns:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERECORD_CONTENT\u003C/strong\u003E - This contains the Kafka message.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERECORD_METADATA\u003C/strong\u003E - This contains metadata about the message, for example, the topic from which the message was read.\u003C/li\u003E\u003C/ul\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThere are \u003Cstrong\u003EEXTERNAL ACTIVITY\u003C/strong\u003E sections in the worksheet, which will be executed within the \u003Cstrong\u003EGitHub Codespace\u003C/strong\u003E terminal. Details in the next steps.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EINFO: Snowpipe Streaming Ingest Client SDK\u003C/h4\u003E\n","\u003Cp\u003ESnowflake provides an \u003Ca href=\"https://mvnrepository.com/artifact/net.snowflake/snowflake-ingest-sdk\"\u003EIngest Client SDK\u003C/a\u003E in Java that allows applications, such as Kafka Connectors, to stream rows of data into a Snowflake table at low latency.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/data-load-snowpipe-streaming.png\" alt=\"assets/data-load-snowpipe-streaming.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThe Ingest Client SDK is configured with a secure JDBC connection to Snowflake, and will establish a streaming \u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview#channels\"\u003EChannel\u003C/a\u003E between the client and a Snowflake table.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/data-load-snowpipe-streaming-client-channel.png\" alt=\"assets/data-load-snowpipe-streaming-client-channel.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 2 - Test Streaming Client\u003C/h3\u003E\n","\u003Cp\u003ENow that a staging table is available to stream time series data. We can look at setting up a streaming connection channel with a Java Snowpipe Streaming client. The simulator Java application is available in the \u003Ccode\u003Eiotstream\u003C/code\u003E folder of the lab, and can be run via a terminal with a Java runtime.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThe lab environment has been set up with a \u003Cstrong\u003EJava Runtime\u003C/strong\u003E to execute the Java Snowpipe Streaming client application.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Ccode\u003EMenu &gt; Terminal &gt; New Terminal\u003C/code\u003E - a new terminal window will now open\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png\" alt=\"assets/labsetup_newterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EChange directory into to the \u003Cstrong\u003Eiotstream\u003C/strong\u003E folder: \u003Ccode\u003Ecd iotstream\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd iotstream\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003ERun the \u003Ccode\u003ETest.sh\u003C/code\u003E script to confirm a table channel stream can be established with Snowflake.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E./Test.sh\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003Esuccessful\u003C/strong\u003E, it will return:\n\u003Ccode\u003E** Successfully Connected, Test complete! **\u003C/code\u003E\u003C/p\u003E\n","\u003Cp\u003EThis will confirm that the Java streaming client is able to connect to Snowflake, and is able to establish a channel to the target table.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_2_ingest.sql\u003C/code\u003E and run the \u003Ccode\u003ESHOW CHANNELS\u003C/code\u003E command to confirm a channel is now open to Snowflake.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESHOW CHANNELS;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe query should return a single channel \u003Ccode\u003ECHANNEL_1_TEST\u003C/code\u003E opened to the \u003Ccode\u003ERAW_TS_IOTSTREAM_DATA\u003C/code\u003E table.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_channeltest.png\" alt=\"assets/snowpipe_channeltest.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWith a channel now opened to the table we are ready to stream data into the table.\u003C/strong\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 3 - Load a Simulated IoT Data Set\u003C/h3\u003E\n","\u003Cp\u003EWith the channel connection being successful, we can now load the IoT data set, as fast as the connection and machine will allow.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_streamingclient.png\" alt=\"assets/snowpipe_streamingclient.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EThe simulated \u003Cstrong\u003EIoT dataset contains six sensor devices\u003C/strong\u003E at various frequencies, with each device being assigned a unique Tag Names within a single \u003Cstrong\u003Enamespace\u003C/strong\u003E called \u003Cstrong\u003E&quot;IOT&quot;\u003C/strong\u003E.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ENamespace\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ETag Name\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EFrequency\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EUnits\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EData Type\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003ESensor Type\u003C/strong\u003E\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG101\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E5 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPSI\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPressure Gauge\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG201\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E10 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERPM\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EMotor RPM\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG301\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EKPA\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPressure Gauge\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG401\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E60 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECM3S\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EFlow Sensor\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG501\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E60 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDEGF\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETemperature Gauge\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EIOT\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETAG601\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E10 SEC\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EKPA\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDOUBLE\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EPressure Gauge\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n\u003Col\u003E\u003Cli\u003EIn the \u003Cstrong\u003EVS Code\u003C/strong\u003E \u003Ccode\u003ETerminal\u003C/code\u003E run the \u003Ccode\u003ERun_MAX.sh\u003C/code\u003E script to load the IoT data.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E./Run_MAX.sh\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EDepending on the \u003Cstrong\u003Espeed of the machine\u003C/strong\u003E running the Java streaming client application, and the \u003Cstrong\u003Enetwork connectivity\u003C/strong\u003E, this may take a minute to load.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Java Streaming Client Application\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EJava streaming client application\u003C/strong\u003E is being called using a \u003Cstrong\u003ETerminal shell script\u003C/strong\u003E. The Java application accepts various speed input parameters to change the number of rows that are streamed. The \u003Cstrong\u003E&quot;MAX&quot;\u003C/strong\u003E script will send as many rows as the device will allow to the \u003Cstrong\u003ESnowpipe Streaming API\u003C/strong\u003E and into the target table.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_2_ingest.sql\u003C/code\u003E and run the \u003Ccode\u003ESHOW CHANNELS\u003C/code\u003E command to confirm a new channel is now open to Snowflake.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESHOW CHANNELS;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003EThe query should return a new channel \u003Ccode\u003ECHANNEL_1_MAX\u003C/code\u003E opened to the \u003Ccode\u003ERAW_TS_IOTSTREAM_DATA\u003C/code\u003E table, with an \u003Cstrong\u003Eoffset_token\u003C/strong\u003E showing the number of rows loaded.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_channelmax.png\" alt=\"assets/snowpipe_channelmax.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_2_ingest.sql\u003C/code\u003E and view the streamed records, by running the \u003Ccode\u003ECheck stream table data\u003C/code\u003E script.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Check stream table data\nSELECT * FROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA LIMIT 10;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERECORD_METADATA\u003C/strong\u003E - This contains metadata about IOT Tag reading.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_record_meta.png\" alt=\"assets/snowpipe_record_meta.png\"\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERECORD_CONTENT\u003C/strong\u003E - This contains the IOT Tag reading.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_record_content.png\" alt=\"assets/snowpipe_record_content.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EEach IoT device reading is a \u003Cstrong\u003EJSON payload\u003C/strong\u003E, transmitted in the following Kafka like format:\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-json\"\u003E{\n    &quot;meta&quot;:\n    {\n        &quot;LogAppendTime&quot;: &quot;1714487166815&quot;,\n        &quot;headers&quot;:\n        {\n            &quot;namespace&quot;: &quot;IOT&quot;,\n            &quot;source&quot;: &quot;STREAM_DATA.csv&quot;,\n            &quot;speed&quot;: &quot;MAX&quot;\n        },\n        &quot;offset&quot;: &quot;116&quot;,\n        &quot;partition&quot;: &quot;1&quot;,\n        &quot;topic&quot;: &quot;time-series&quot;\n    },\n    &quot;content&quot;:\n    {\n        &quot;datatype&quot;: &quot;double&quot;,\n        &quot;tagname&quot;: &quot;SENSOR/TAG301&quot;,\n        &quot;timestamp&quot;: &quot;1704067279&quot;,\n        &quot;units&quot;: &quot;KPA&quot;,\n        &quot;value&quot;: &quot;118.152&quot;\n    } \n}\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EData has now been \u003Cstrong\u003Estreamed into Snowflake\u003C/strong\u003E, and we can now look at modeling the data for analytics.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EIf you encounter issues with getting data loaded via the \u003Cstrong\u003ESnowpipe Streaming Ingestion\u003C/strong\u003E section, use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EConnection Test.sh Script Error: Exception in thread &quot;main&quot; java.lang.SecurityException: Authorization failed after retry\u003C/h4\u003E\n","\u003Cp\u003EThis error indicates that the \u003Cstrong\u003Euser public key setup\u003C/strong\u003E is the likely issue.\u003C/p\u003E\n","\u003Cp\u003ERefer to the \u003Cstrong\u003E&quot;Lab Setup&quot; section Step 7 and 8\u003C/strong\u003E, and then run through the \u003Cstrong\u003ESetup Snowflake Resources\u003C/strong\u003E section again.\u003C/p\u003E\n","\u003Ch4\u003EManually Load the IoT Data\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EInside the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E folder open \u003Ccode\u003Ehelp/snowflake_manual_ingest.sql\u003C/code\u003E and \u003Cstrong\u003Ecopy\u003C/strong\u003E the contents of the file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPaste\u003C/strong\u003E the copied content into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun\u003C/strong\u003E all the commands in the worksheet.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch4\u003EGitHub Codespace is Showing Out of Memory Errors\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EGitHub Codespace machine type\u003C/strong\u003E can be changed to an instance with more memory.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Ca href=\"https://github.com/codespaces\"\u003EGitHub Codespaces\u003C/a\u003E. Select \u003Ccode\u003EMenu &gt; Change machine type\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machine.png\" alt=\"assets/troubleshoot_ingest_codespace_machine.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003ESelect a \u003Cstrong\u003Emachine type with more memory\u003C/strong\u003E, and click \u003Ccode\u003EUpdate Codespace\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machineupdate.png\" alt=\"assets/troubleshoot_ingest_codespace_machineupdate.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EIf the GitHub Codespace was already running, select \u003Ccode\u003EMenu &gt; Stop codespace\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machinestop.png\" alt=\"assets/troubleshoot_ingest_codespace_machinestop.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003ESelect the Github Codespace to launch it, and \u003Cstrong\u003ERe-run\u003C/strong\u003E the ingestion scripts.\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EData Modeling and Transformation\u003C/h2\u003E\n","\u003Cp\u003ENow that data has been streamed into Snowflake, we are ready for some \u003Cstrong\u003EData Engineering\u003C/strong\u003E activities to get the data into a report ready state for analytics. We'll be \u003Cstrong\u003Etransforming the data\u003C/strong\u003E from the \u003Cstrong\u003EJSON VARIANT\u003C/strong\u003E format into a tabular format. Using Snowflake \u003Cstrong\u003EDynamic Tables\u003C/strong\u003E, the data streamed into Snowflake will continuously update the analytics layers.\u003C/p\u003E\n","\u003Cp\u003EAlong with setting up Dynamic Tables for continuous loading, we'll also deploy some \u003Cstrong\u003Eanalytics views\u003C/strong\u003E for the consumer serving layer. This will allow for specific columns of data to be exposed to the end users and applications.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dataengineering.png\" alt=\"assets/model_dataengineering.png\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EINFO: Dynamic Tables\u003C/h4\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-intro\"\u003EDynamic Tables\u003C/a\u003E are a declarative way of defining your data pipeline in Snowflake. It's a Snowflake table which is \u003Cstrong\u003Edefined as a query to continuously and automatically materialize the result of that query as a table\u003C/strong\u003E. Dynamic Tables can join and aggregate across \u003Cstrong\u003Emultiple source objects\u003C/strong\u003E and \u003Cstrong\u003Eincrementally update\u003C/strong\u003E results as sources change.\u003C/p\u003E\n","\u003Cp\u003EDynamic Tables can also be chained together to create a DAG for more complex data pipelines.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/dynamic_tables.png\" alt=\"assets/dynamic_tables.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 1 - Model Time Series Data with Dynamic Tables\u003C/h3\u003E\n","\u003Cp\u003EFor the IoT streaming data we'll setup two Dynamic Tables in a simple Dimension and Fact model:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDT_TS_TAG_METADATA (Dimension)\u003C/strong\u003E: Containing Tag Metadata such as tag names, sourcing, and data types\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDT_TS_TAG_READINGS (Fact)\u003C/strong\u003E: Containing the readings from each IoT sensor in raw and numeric format\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables.png\" alt=\"assets/model_dynamictables.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_3_transform.sql\u003C/code\u003E and run the \u003Cstrong\u003EDynamic Tables Setup\u003C/strong\u003E scripts.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- Dynamic Tables Setup - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.TRANSFORM;\nUSE WAREHOUSE HOL_TRANSFORM_WH;\n\n/* Tag metadata (Dimension)\nTAGNAME - uppercase concatenation of namespace and tag name\nQUALIFY - deduplication filter to only include unique tag names\n*/\nCREATE OR REPLACE DYNAMIC TABLE HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_METADATA\nTARGET_LAG = '1 MINUTE'\nWAREHOUSE = HOL_TRANSFORM_WH\nREFRESH_MODE = 'INCREMENTAL'\nAS\nSELECT\n    SRC.RECORD_METADATA:headers:namespace::VARCHAR AS NAMESPACE,\n    SRC.RECORD_METADATA:headers:source::VARCHAR AS TAGSOURCE,\n    UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) AS TAGNAME,\n    SRC.RECORD_CONTENT:units::VARCHAR AS TAGUNITS,\n    SRC.RECORD_CONTENT:datatype::VARCHAR AS TAGDATATYPE\nFROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA SRC\nQUALIFY ROW_NUMBER() OVER (PARTITION BY UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) ORDER BY SRC.RECORD_CONTENT:timestamp::NUMBER, SRC.RECORD_METADATA:offset::NUMBER) = 1;\n\n/* Tag readings (Fact)\nTAGNAME - uppercase concatenation of namespace and tag name\nQUALIFY - deduplication filter to only include unique tag readings based on tagname and timestamp\n*/\nCREATE OR REPLACE DYNAMIC TABLE HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_READINGS\nTARGET_LAG = '1 MINUTE'\nWAREHOUSE = HOL_TRANSFORM_WH\nREFRESH_MODE = 'INCREMENTAL'\nAS\nSELECT\n    UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) AS TAGNAME,\n    SRC.RECORD_CONTENT:timestamp::VARCHAR::TIMESTAMP_NTZ AS TIMESTAMP,\n    SRC.RECORD_CONTENT:value::VARCHAR AS VALUE,\n    TRY_CAST(SRC.RECORD_CONTENT:value::VARCHAR AS FLOAT) AS VALUE_NUMERIC,\n    SRC.RECORD_METADATA:partition::VARCHAR AS PARTITION,\n    SRC.RECORD_METADATA:offset::VARCHAR AS OFFSET\nFROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA SRC\nQUALIFY ROW_NUMBER() OVER (PARTITION BY UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))), SRC.RECORD_CONTENT:timestamp::NUMBER ORDER BY SRC.RECORD_METADATA:offset::NUMBER) = 1;\n\n/*##############################\n-- Dynamic Tables Setup - END\n##############################*/\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Dynamic Table TARGET_LAG Parameter\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDynamic Tables\u003C/strong\u003E have a \u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-refresh#label-dynamic-tables-understand-dt-lag\"\u003ETARGET_LAG\u003C/a\u003E parameter, which defines a \u003Cstrong\u003Etarget &ldquo;freshness&rdquo;\u003C/strong\u003E for the  data. In this case, we have configured the Dynamic Tables to have a TARGET_LAG of 1 minute, so we want the Dynamic Table to \u003Cstrong\u003Eupdate within 1 minute of the base tables being updated\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 2 - Review Dynamic Table Details\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EData &gt; Databases &gt; HOL_TIMESERIES &gt; TRANSFORM &gt; Dynamic Tables &gt; DT_TS_TAG_METADATA &gt; Refresh History\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe DT_TS_TAG_METADATA table will show six rows loaded, representing the six tags of data streamed into Snowflake\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_metadata.png\" alt=\"assets/model_dynamictables_metadata.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EOpen the \u003Ccode\u003EData Preview\u003C/code\u003E tab\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EYou can now see the Tag Metadata in a columnar table format\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_metadata_preview.png\" alt=\"assets/model_dynamictables_metadata_preview.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003ESelect \u003Ccode\u003EDynamic Tables &gt; DT_TS_TAG_READINGS &gt; Refresh History\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe DT_TS_TAG_READINGS table will show all the tag readings streamed into Snowflake\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_readings.png\" alt=\"assets/model_dynamictables_readings.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003EOpen the \u003Ccode\u003EData Preview\u003C/code\u003E tab\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EYou can now see the Tag Readings in a columnar table format\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_readings_preview.png\" alt=\"assets/model_dynamictables_readings_preview.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EData is now being \u003Cstrong\u003Etransformed in Snowflake\u003C/strong\u003E using \u003Cstrong\u003EDynamic Tables\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 3 - Create Analytics Views for Consumers\u003C/h3\u003E\n","\u003Cp\u003EThe Dynamic Tables are now set up to continuously transform streaming data. We can now look at setting up a \u003Cstrong\u003ECurated Analytics\u003C/strong\u003E serving layer with some views for end users and applications to consume the streaming data.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_analyticviews.png\" alt=\"assets/model_analyticviews.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EWe'll create a set of analytics views similar to the Dynamic Tables with a subset of columns in the \u003Cstrong\u003EANALYTICS\u003C/strong\u003E schema:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ETS_TAG_REFERENCE (Dimension)\u003C/strong\u003E: Containing Tag Metadata such as tag names, sourcing, and data types\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETS_TAG_READINGS (Fact)\u003C/strong\u003E: Containing the readings from each IoT sensor in raw and numeric format\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_3_transform.sql\u003C/code\u003E and run the \u003Cstrong\u003EAnalytics Views Setup\u003C/strong\u003E scripts.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- Analytics Views Setup - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Tag Reference View\nCREATE OR REPLACE VIEW HOL_TIMESERIES.ANALYTICS.TS_TAG_REFERENCE AS\nSELECT\n    META.NAMESPACE,\n    META.TAGSOURCE,\n    META.TAGNAME,\n    META.TAGUNITS,\n    META.TAGDATATYPE\nFROM HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_METADATA META;\n\n-- Tag Readings View\nCREATE OR REPLACE VIEW HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS AS\nSELECT\n    READ.TAGNAME,\n    READ.TIMESTAMP,\n    READ.VALUE,\n    READ.VALUE_NUMERIC\nFROM HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_READINGS READ;\n\n/*##############################\n-- Analytics Views Setup - END\n##############################*/\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EData is now \u003Cstrong\u003Emodeled in Snowflake\u003C/strong\u003E and available in the \u003Cstrong\u003EANALYTICS\u003C/strong\u003E schema, and we can now proceed to analyze the data using Snowflake time series functions.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EThis section runs through a \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E, this can be run in Snowflake with a \u003Cstrong\u003ESnowsight Worksheet\u003C/strong\u003E. Use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EInside the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E folder open \u003Ccode\u003Eworksheets/hol_timeseries_3_transform.sql\u003C/code\u003E and \u003Cstrong\u003Ecopy\u003C/strong\u003E the contents of the file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPaste\u003C/strong\u003E the copied content into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun\u003C/strong\u003E all the commands in the worksheet.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ETime Series Analysis\u003C/h2\u003E\n","\u003Cp\u003ENow that we have created the analytics views, we can start to query the data using \u003Cstrong\u003ESnowflake native time series functions\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_overview.png\" alt=\"assets/analysis_overview.png\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EINFO: Time Series Query Profiles\u003C/h4\u003E\n","\u003Cp\u003EThe following query profiles will be covered in this section.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EQuery Type\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EFunctions\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDescription\u003C/strong\u003E\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERaw\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETime Boundary: Left, Right, and Both\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ERaw data within a time range.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EMath \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-aggregation\"\u003EStatistical Aggregates\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/min\"\u003EMIN\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/max\"\u003EMAX\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/avg\"\u003EAVG\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/count\"\u003ECOUNT\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/sum\"\u003ESUM\u003C/a\u003E, FREQUENCY\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EMathematical calculations over values within a time range.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDistribution \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-aggregation\"\u003EStatistical Aggregates\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/approx_percentile\"\u003EAPPROX_PERCENTILE\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/stddev\"\u003ESTDDEV\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/variance\"\u003EVARIANCE\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/kurtosis\"\u003EKURTOSIS\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/skew\"\u003ESKEW\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EStatistics on distributions of data.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-analytic\"\u003EWindow Functions\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/lag\"\u003ELAG\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/lead\"\u003ELEAD\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/first_value\"\u003EFIRST_VALUE\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/last_value\"\u003ELAST_VALUE\u003C/a\u003E, ROWS BETWEEN, RANGE BETWEEN\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EFunctions over a group of related rows.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EWatermarks\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/max_by\"\u003EMAX_BY\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/min_by\"\u003EMIN_BY\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EFind latest or earliest values ordered by timestamps.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDownsampling / Time Binning\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/time_slice\"\u003ETIME_SLICE\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETime binning aggregations over time intervals.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EAligning time series datasets\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/constructs/asof-join\"\u003EASOF JOIN\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EJoining time series datasets when the timestamps don't match exactly, and interpolating values.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGap Filling\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/generator\"\u003EGENERATOR\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/row_number\"\u003EROW_NUMBER\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/seq1\"\u003ESEQ\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGenerating timestamps to fill time gaps.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EForecasting\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting\"\u003ETime-Series Forecasting (Snowflake Cortex ML Functions)\u003C/a\u003E, \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/classes/forecast/commands/create-forecast\"\u003EFORECAST\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EGenerating Time Series Forecasts using Snowflake Cortex ML.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDate &amp; Time Functions\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-date-time\"\u003EDate &amp; Time Functions\u003C/a\u003E\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EThis family of functions can be used to construct, convert, extract, or modify DATE/TIME/TIMESTAMP data.\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003EStep 1 - Copy Worksheet Content To Snowsight Worksheet\u003C/h3\u003E\n","\u003Ch4\u003EThis section will be executed within a Snowflake Snowsight Worksheet\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_4_anaysis.sql\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECopy\u003C/strong\u003E the contents of the worksheet to \u003Cstrong\u003Eclipboard\u003C/strong\u003E, and paste it into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Snowsight Worksheet Query Statement Execution\u003C/h4\u003E\n","\u003Cp\u003EIn the following sections you will run various query statements within a \u003Cstrong\u003ESnowsight Worksheet\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMultiple Statements:\u003C/strong\u003E To run multiple query statements, \u003Cstrong\u003Ehighlight all the query statements you want to run together\u003C/strong\u003E, and then click the \u003Ccode\u003ERun\u003C/code\u003E button.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_queryrun_multi.png\" alt=\"assets/analysis_info_queryrun_multi.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIndividual Statements:\u003C/strong\u003E To run individual query statements, \u003Cstrong\u003Eselect the query by placing your cursor within the query statement\u003C/strong\u003E, and then click the \u003Ccode\u003ERun\u003C/code\u003E button at the top right of the worksheet.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_queryrun.png\" alt=\"assets/analysis_info_queryrun.png\"\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 2 - Run Through the Snowsight Worksheet Time Series Analysis Queries\u003C/h3\u003E\n","\u003Ch3\u003ESet Session Context\u003C/h3\u003E\n","\u003Cp\u003ERun the following three statements to ensure the worksheet session is in the right context.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EExploring Raw Time Series Data\u003C/h3\u003E\n","\u003Cp\u003EWe'll start with a simple \u003Cstrong\u003ERaw\u003C/strong\u003E query that returns time series data between an input start time and end time.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERaw\u003C/strong\u003E: Retrieve time series data between an input start time and end time.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* RAW\nRetrieve time series data between an input start time and end time.\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_rawleft.png\" alt=\"assets/analysis_query_rawleft.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ETime Series Statistical Aggregates\u003C/h3\u003E\n","\u003Cp\u003EThe following set of queries contains various \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-aggregation\"\u003EAggregate Functions\u003C/a\u003E covering \u003Cstrong\u003Ecounts, math operations, distributions, and watermarks\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECounts\u003C/strong\u003E: Retrieve count and distinct counts within the time boundary.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* COUNT AND COUNT DISTINCT\nRetrieve count and distinct counts within the time boundary.\n\nCOUNT - Count of all values\nCOUNT DISTINCT - Count of unique values\n\nNote: Counts can work with both varchar and numeric data types.\n*/\nSELECT TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP,\n    COUNT(VALUE) AS COUNT_VALUE,\n    COUNT(DISTINCT VALUE) AS COUNT_DISTINCT_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggcount.png\" alt=\"assets/analysis_query_aggcount.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMath Operations\u003C/strong\u003E: Retrieve statistical detail for the readings within the time boundary.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* MIN/MAX/AVG/SUM\nRetrieve statistical aggregates for the readings within the time boundary using math operations.\n\nMIN - Minimum value\nMAX - Maximum value\nAVG - Average of values (mean)\nSUM - Sum of values\n\nNote: Aggregates can work with numerical data types.\n*/\nSELECT TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP,\n    MIN(VALUE_NUMERIC) AS MIN_VALUE,\n    MAX(VALUE_NUMERIC) AS MAX_VALUE,\n    SUM(VALUE_NUMERIC) AS SUM_VALUE,\n    AVG(VALUE_NUMERIC) AS AVG_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS \nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggminmaxavgsum.png\" alt=\"assets/analysis_query_aggminmaxavgsum.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERelative Frequency\u003C/strong\u003E: Consider the use case of \u003Cstrong\u003Ecalculating the frequency and relative frequency\u003C/strong\u003E of each value within a specific time frame, to \u003Cstrong\u003Edetermine how often the value occurs\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003EFind the value that occurs most frequently within a time frame.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* RELATIVE FREQUENCY\nConsider the use case of calculating the frequency and relative frequency of each value\nwithin a specific time frame, to determine how often the value occurs.\n\nFind the value that occurs most frequently within a time frame.\n*/\nSELECT \n    TAGNAME,\n    VALUE,\n    COUNT(VALUE) AS FREQUENCY,\n    COUNT(VALUE) / SUM(COUNT(VALUE)) OVER(PARTITION BY TAGNAME) AS RELATIVE_FREQUENCY\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME IN ('/IOT/SENSOR/TAG501')\nAND TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND VALUE IS NOT NULL\nGROUP BY TAGNAME, VALUE\nORDER BY TAGNAME, FREQUENCY DESC;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERelative Frequency\u003C/strong\u003E: Value 424 occurs most, with a frequency of 13 and a relative frequency of 21.6%.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_relativefrequency.png\" alt=\"assets/analysis_query_relativefrequency.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Query Result Data Contract\u003C/h4\u003E\n","\u003Cp\u003EThe following \u003Cstrong\u003Etwo\u003C/strong\u003E queries are written with a standard return set of columns, namely \u003Cstrong\u003ETAGNAME, TIMESTAMP, and VALUE\u003C/strong\u003E. This is a way to structure your query results format if \u003Cstrong\u003Elooking to build an API for time series data\u003C/strong\u003E, similar to a data contract with consumers.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ETAGNAME\u003C/strong\u003E is updated to show that a calculation has been applied to the returned values, and multiple aggregations can be grouped together using \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/operators-query\"\u003EUNION ALL\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDistribution Statistics\u003C/strong\u003E: Retrieve distribution sample statistics within the time boundary.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* DISTRIBUTIONS - sample distributions statistics\nRetrieve distribution sample statistics within the time boundary.\n\nPERCENTILE_50 - 50% of values are less than this value.\nPERCENTILE_95 - 95% of values are less than this value.\nSTDDEV - Closeness to the mean/average of the distribution.\nVARIANCE - Spread between numbers in the time boundary.\nKURTOSIS - Measure of outliers occuring.\nSKEW - Left (negative) and right (positive) distribution skew.\n\nNote: Distributions can work with numerical data types.\n*/\nSELECT TAGNAME || '~PERCENTILE_50_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, APPROX_PERCENTILE(VALUE_NUMERIC, 0.5) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~PERCENTILE_95_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, APPROX_PERCENTILE(VALUE_NUMERIC, 0.95) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~STDDEV_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, STDDEV(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~VARIANCE_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, VARIANCE(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~KURTOSIS_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, KURTOSIS(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~SKEW_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, SKEW(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggdistributions.png\" alt=\"assets/analysis_query_aggdistributions.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWatermarks\u003C/strong\u003E: Consider the use case of \u003Cstrong\u003Edetermining a sensor variance over time\u003C/strong\u003E by calculating the latest (high watermark) and earliest (low watermark) readings within a time boundary.\u003C/p\u003E\n","\u003Cp\u003ERetrieve both the high watermark (latest time stamped value) and low watermark (earliest time stamped value) readings within the time boundary.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* WATERMARKS\nRetrieve both the high watermark (latest time stamped value) and low watermark (earliest time stamped value) readings within the time boundary.\n\nMAX_BY - High Watermark - latest reading in the time boundary\nMIN_BY - Low Watermark - earliest reading in the time boundary\n*/\nSELECT TAGNAME || '~MAX_BY_1HOUR' AS TAGNAME, MAX_BY(TIMESTAMP, TIMESTAMP) AS TIMESTAMP, MAX_BY(VALUE, TIMESTAMP) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~MIN_BY_1HOUR' AS TAGNAME, MIN_BY(TIMESTAMP, TIMESTAMP) AS TIMESTAMP, MIN_BY(VALUE, TIMESTAMP) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggwatermark.png\" alt=\"assets/analysis_query_aggwatermark.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ETime Series Analytics using Window Functions\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-analytic\"\u003EWindow Functions\u003C/a\u003E enable aggregates to operate over groups of data, looking forward and backwards in the ordered data rows, and returning a single result for each group. More detail available in \u003Ca href=\"https://docs.snowflake.com/en/user-guide/functions-window-using\"\u003EUsing Window Functions\u003C/a\u003E.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe \u003Cstrong\u003EOVER()\u003C/strong\u003E clause defines the group of rows used in the calculation.\u003C/li\u003E\u003Cli\u003EThe \u003Cstrong\u003EPARTITION BY\u003C/strong\u003E sub-clause allows us to divide that window into sub-windows.\u003C/li\u003E\u003Cli\u003EThe \u003Cstrong\u003EORDER BY\u003C/strong\u003E clause can be used with ASC (ascending) or DESC (descending), and allows ordering of the partition sub-window rows.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELag and Lead\u003C/strong\u003E: Consider the use case where you need to analyze the \u003Cstrong\u003Echanges in the readings\u003C/strong\u003E of a specific IoT sensor \u003Cstrong\u003Eover a short period\u003C/strong\u003E (say 10 seconds) by examining the \u003Cstrong\u003Ecurrent, previous, and next values\u003C/strong\u003E of the readings.\u003C/p\u003E\n","\u003Cp\u003EAccess data in previous (LAG) or subsequent (LEAD) rows without having to join the table to itself.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* WINDOW FUNCTIONS - LAG AND LEAD\nConsider the use case where you need to analyze the changes in the readings of a specific IoT sensor\nover a short period (say 10 seconds) by examining the current, previous, and next values of the readings.\n\nAccess data in previous (LAG) or subsequent (LEAD) rows without having to join the table to itself.\n\nLAG - Prior time period value\nLEAD - Next time period value\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    LAG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LAG_VALUE,\n    LEAD(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LEAD_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowlaglead.png\" alt=\"assets/analysis_query_windowlaglead.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFirst and Last Value\u003C/strong\u003E: Consider the use case of \u003Cstrong\u003Echange detection\u003C/strong\u003E where you want to \u003Cstrong\u003Edetect any sudden pressure changes\u003C/strong\u003E in comparison to initial and final values in a specific time frame.\u003C/p\u003E\n","\u003Cp\u003EFor this you would use the \u003Cstrong\u003EFIRST_VALUE\u003C/strong\u003E and \u003Cstrong\u003ELAST_VALUE\u003C/strong\u003E window functions to retrieve the first and last values within the time boundary to perform such an analysis.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* FIRST_VALUE AND LAST_VALUE\nConsider the use case of change detection where you want to detect any sudden pressure changes in comparison to initial and final values in a specific time frame.\n\nFor this you would use the FIRST_VALUE and LAST_VALUE window functions to retrieve the first and last values within the time boundary to perform such an analysis.\n\nFIRST_VALUE - First value in the time boundary\nLAST_VALUE - Last value in the time boundary\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE, \n    FIRST_VALUE(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS FIRST_VALUE,\n    LAST_VALUE(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LAST_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowfirstlast.png\" alt=\"assets/analysis_query_windowfirstlast.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERows Between - Preceding and Following\u003C/strong\u003E: Consider the use case, where the data you have is \u003Cstrong\u003Esecond by second\u003C/strong\u003E sensor readings, and you want to compute the \u003Cstrong\u003Erolling 6 second average\u003C/strong\u003E of sensor readings over a specific time frame to \u003Cstrong\u003Edetect trends and patterns\u003C/strong\u003E in the data.\u003C/p\u003E\n","\u003Cp\u003EIn cases where the data \u003Cstrong\u003Edoesn't have any gaps\u003C/strong\u003E, you can use \u003Cstrong\u003EROWS BETWEEN\u003C/strong\u003E window frames to perform these \u003Cstrong\u003Erolling calculations\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003ECreate a rolling AVG for the five preceding and following rows, inclusive of the current row.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* WINDOW FUNCTIONS - ROWS BETWEEN\nConsider the use case, where the data you have second by second sensor reading and you want to compute the\nrolling 6 second average of sensor readings over a specific time frame to detect trends and patterns in the data. \n\nIn cases where the data doesn't have any gaps like this one, you can use ROW BETWEEN\nwindow frames to perform these rolling calculations.\n\nCreate a rolling AVG for the five preceding and following rows, inclusive of the current row.\n\nROW_AVG_PRECEDING - Rolling AVG from 5 preceding rows and current row\nROW_AVG_FOLLOWING - Rolling AVG from current row and 5 following rows\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS ROW_AVG_PRECEDING,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN CURRENT ROW AND 5 FOLLOWING) AS ROW_AVG_FOLLOWING\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 00:01:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Snowsight Statistics\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowflake \u003Ca href=\"https://docs.snowflake.com/en/user-guide/ui-snowsight\"\u003ESnowsight\u003C/a\u003E\u003C/strong\u003E will provide high level statistics and histograms for columns of data, as well as selected cells of numerical data, to the right of the returned result set.\u003C/p\u003E\n","\u003Cp\u003EMore detail at \u003Ca href=\"https://docs.snowflake.com/en/user-guide/ui-snowsight-query#exploring-the-worksheet-results\"\u003EExploring the worksheet results\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESelecting the first six row cells will show the matching ROWS BETWEEN averages preceding and following\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrowsbetween.png\" alt=\"assets/analysis_query_windowrowsbetween.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003ENow assume a scenario, where there are \u003Cstrong\u003Etime gaps or missing data\u003C/strong\u003E received from a sensor. Such as a sensor that sends roughly every 5 seconds and experiences a fault.\u003C/p\u003E\n","\u003Cp\u003EIn this example I am using \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/date_part\"\u003EDATE_PART\u003C/a\u003E to exclude seconds 20, 45, and 55 from the data.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 00:02:00'\nAND TAGNAME = '/IOT/SENSOR/TAG101'\nAND DATE_PART('SECOND', TIMESTAMP) NOT IN (20, 45, 55)\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_gaps.png\" alt=\"assets/analysis_query_windowrangebetween_gaps.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003ENow say you want to perform an aggregation to \u003Cstrong\u003Ecalculate the 1 minute rolling average\u003C/strong\u003E of sensor readings,\nover a specific time frame to detect trends and patterns in the data.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EROWS BETWEEN\u003C/strong\u003E may NOT yield correct results, as the number of rows that make up the 1 minute interval could be inconsistent. In this case for a 5 second tag without gaps, you might have assumed 12 rows would make up 1 minute.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003ENOTE: At the time of publishing this lab, in late May 2024, the RANGE BETWEEN function was in Private Preview. We have included it in the lab content for reference. If you receive errors when running the RANGE BETWEEN queries, it may NOT be released in your region just yet, it is targeted to be Public Preview soon. Please review the \u003Ca href=\"https://docs.snowflake.com/en/release-notes/preview-features\"\u003ESnowflake Preview Features\u003C/a\u003E page for more information.\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThis is where \u003Cstrong\u003ERANGE BETWEEN\u003C/strong\u003E can be used with intervals of time that can be added or subtracted from timestamps.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERANGE BETWEEN\u003C/strong\u003E differs from \u003Cstrong\u003EROWS BETWEEN\u003C/strong\u003E in that it can:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EHandle time gaps\u003C/strong\u003E in data being analyzed.\n\u003Cul\u003E\u003Cli\u003EFor example, if a sensor is faulty or sends data at inconsistent intervals.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003EAllow for \u003Cstrong\u003Ereporting frequencies that differ\u003C/strong\u003E from the data frequency.\n\u003Cul\u003E\u003Cli\u003EFor example, data at 5 second frequency that you want to aggregate the prior 1 minute.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_range_between.png\" alt=\"assets/analysis_info_range_between.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EMore detail at \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/data-types-datetime#interval-constants\"\u003EInterval Constants\u003C/a\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERange Between - 1 MIN Rolling Average and Sum showing gap differences\u003C/strong\u003E: Create a rolling AVG and SUM for the time \u003Cstrong\u003EINTERVAL\u003C/strong\u003E 1 minute preceding, inclusive of the current row. Assuming the preceding 12 rows would make up 1 minute of data.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003ESELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '1 MIN' PRECEDING AND CURRENT ROW) AS RANGE_AVG_1MIN,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) AS ROW_AVG_1MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '1 MIN' PRECEDING AND CURRENT ROW) AS RANGE_SUM_1MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) AS ROW_SUM_1MIN\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND DATE_PART('SECOND', TIMESTAMP) NOT IN (20, 45, 55)\nAND TAGNAME = '/IOT/SENSOR/TAG101'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe first minute of data aligns for both RANGE BETWEEN and ROWS BETWEEN, however, after the first minute the rolling values will start to show variances due to the introduced time gaps\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_error.png\" alt=\"assets/analysis_query_windowrangebetween_error.png\"\u003E\u003C/p\u003E\n","\u003Ch5\u003ECHART: Rolling 1 MIN Average and Sum - showing differences between RANGE BETWEEN and ROWS BETWEEN\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select the \u003Ccode\u003EVALUE\u003C/code\u003E column and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003ERANGE_AVG_1MIN\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003EROW_AVG_1MIN\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe chart shows variances between the RANGE BETWEEN and ROWS BETWEEN occuring after the first minute\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_rangerow_1min.png\" alt=\"assets/analysis_chart_rangerow_1min.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERange Between - 5 MIN Rolling Average and Sum\u003C/strong\u003E: Let's expand on RANGE BETWEEN and create a rolling AVG and SUM for the time \u003Cstrong\u003EINTERVAL\u003C/strong\u003E five minutes preceding, inclusive of the current row.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* WINDOW FUNCTIONS - RANGE BETWEEN\nLet's expand on RANGE BETWEEN and create a rolling AVG and SUM for the time **INTERVAL** five minutes preceding, inclusive of the current row.\n\nINTERVAL - 5 MIN AVG and SUM preceding the current row\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '5 MIN' PRECEDING AND CURRENT ROW) AS RANGE_AVG_5MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '5 MIN' PRECEDING AND CURRENT ROW) AS RANGE_SUM_5MIN\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt;= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG401'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_5min.png\" alt=\"assets/analysis_query_windowrangebetween_5min.png\"\u003E\u003C/p\u003E\n","\u003Ch5\u003ECHART: Rolling 5 MIN Average\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select the \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003ERANGE_AVG_5MIN\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EA rolling average could be useful in scenarios where you are trying to detect EXCEEDANCES in equipment operating limits over periods of time, such as a maximum pressure limit\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_range_5min.png\" alt=\"assets/analysis_chart_range_5min.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EDownsampling Time Series Data\u003C/h3\u003E\n","\u003Cp\u003EDownsampling is used to \u003Cstrong\u003Edecrease the frequency of time samples\u003C/strong\u003E, such as from seconds to minutes, by placing time series data into fixed time intervals using aggregate operations on the existing values within each time interval.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETime Binning - 5 min Aggregate\u003C/strong\u003E: Consider a use case where you want to obtain a broader view of a high frequency pressure gauge, by aggregating data into evenly spaced intervals to find trends over time.\u003C/p\u003E\n","\u003Cp\u003ECreate a downsampled time series data set with 5 minute aggregates, showing the \u003Cstrong\u003ESTART and END timestamp label\u003C/strong\u003E of each interval.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* TIME BINNING - 5 min AGGREGATE with START and END label\nCreate a downsampled time series data set with 5 minute aggregates, showing the START and END timestamp label of each interval.\n\nCOUNT - Count of values within the time bin\nSUM - Sum of values within the time bin\nAVG - Average of values (mean) within the time bin\nPERCENTILE_95 - 95% of values are less than this within the time bin\n*/\nSELECT TAGNAME,\n    TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'START') AS START_TIMESTAMP,\n    TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'END') AS END_TIMESTAMP,\n    COUNT(*) AS COUNT_VALUE,\n    SUM(VALUE_NUMERIC) AS SUM_VALUE,\n    AVG(VALUE_NUMERIC) AS AVG_VALUE,\n    APPROX_PERCENTILE(VALUE_NUMERIC, 0.95) AS PERCENTILE_95_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\nAND TIMESTAMP &lt; '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'START'), TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'END'), TAGNAME\nORDER BY TAGNAME, START_TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFor a one second tag (3600 data points over an hour), the results will show in five minute intervals containing 300 data points each, along with aggregates for counts, sum, average, and 95th percentile values\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_timebin.png\" alt=\"assets/analysis_query_timebin.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EAligning Time Series Data\u003C/h3\u003E\n","\u003Cp\u003EOften you will need to \u003Cstrong\u003Ealign two data sets\u003C/strong\u003E that may have differing time frequencies. To do this you can utilize the \u003Cstrong\u003ETime Series ASOF JOIN\u003C/strong\u003E to pair closely matching records based on timestamps.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EJoining Time Series Data with ASOF JOIN\u003C/strong\u003E: Consider the use case where you want to align a one second and five second pressure gauge to determine if there is a correlation.\u003C/p\u003E\n","\u003Cp\u003EUsing the \u003Ccode\u003EASOF JOIN\u003C/code\u003E, join two data sets by applying a \u003Ccode\u003EMATCH_CONDITION\u003C/code\u003E to pair closely aligned timestamps and values.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* ASOF JOIN - Align a 1 second tag with a 5 second tag\nConsider the use case where you want to align a one second and five second pressure gauge to determine if there is a correlation.\n\nUsing the `ASOF JOIN`, join two data sets by applying a `MATCH_CONDITION` to pair closely aligned timestamps and values.\n*/\nSELECT ONE_SEC.TAGNAME AS ONE_SEC_TAGNAME, ONE_SEC.TIMESTAMP AS ONE_SEC_TIMESTAMP, ONE_SEC.VALUE_NUMERIC AS ONE_SEC_VALUE, FIVE_SEC.VALUE_NUMERIC AS FIVE_SEC_VALUE, FIVE_SEC.TAGNAME AS FIVE_SEC_TAGNAME, FIVE_SEC.TIMESTAMP AS FIVE_SEC_TIMESTAMP\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS ONE_SEC\nASOF JOIN (\n    -- 5 sec tag data\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TAGNAME = '/IOT/SENSOR/TAG101'\n    ) FIVE_SEC\nMATCH_CONDITION(ONE_SEC.TIMESTAMP &gt;= FIVE_SEC.TIMESTAMP)\nWHERE ONE_SEC.TAGNAME = '/IOT/SENSOR/TAG301'\nAND ONE_SEC.TIMESTAMP &gt;= '2024-01-03 09:15:00'\nAND ONE_SEC.TIMESTAMP &lt;= '2024-01-03 09:45:00'\nORDER BY ONE_SEC.TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_asof_align.png\" alt=\"assets/analysis_query_asof_align.png\"\u003E\u003C/p\u003E\n","\u003Ch5\u003ECHART: Aligned Time Series Data\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data set the first Data column to \u003Ccode\u003EONE_SEC_VALUE\u003C/code\u003E with an Aggregation of \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESet the X-Axis to \u003Ccode\u003EONE_SEC_TIMESTAMP\u003C/code\u003E and a Bucketing of \u003Ccode\u003ESecond\u003C/code\u003E\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003EFIVE_SEC_VALUE\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOne sensor is showing a significant drop whilst the other is showing an increase to a peak at similar times, which could potentially be an anomaly\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_align.png\" alt=\"assets/analysis_chart_align.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EGap Filling\u003C/h3\u003E\n","\u003Cp\u003ETime gap filling is the process of generating timestamps for a given start and end time boundary, and joining to a tag with less frequent timestamp values, and filling missing / gap timestamps with a prior value. This can also be referred to as \u003Cstrong\u003EUpsampling or Forward Filling\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EGap Filling\u003C/strong\u003E: Generate timestamps given a start and end time boundary, and use ASOF JOIN to a tag dataset with less frequent values, to forward fill using last observed value carried forward (LOCF).\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* GAP FILLING - 1 SEC TIMESTAMPS WITH 5 SEC TAG\nGenerate timestamps given a start and end time boundary, and use ASOF JOIN\nto a tag dataset with less frequent values, to forward fill using last observed value carried forward (LOCF).\n\n1 - SET TIME_PERIODS - A variable passed into the query to determine the number of time stamps generated for gap filling.\n2 - Run the LOCF query passing in the TIME_PERIODS to the generated calendar\n*/\n-- SET TIME_PERIODS IN SECONDS\nSET TIME_PERIODS = (SELECT TIMESTAMPDIFF('SECOND', '2024-01-01 00:00:00'::TIMESTAMP_NTZ, '2024-01-01 00:00:00'::TIMESTAMP_NTZ + INTERVAL '1 MINUTE'));\n\n-- LAST OBSERVED VALUE CARRIED FORWARD (LOCF) - IGNORE NULLS\nWITH TIMES AS (\n    -- 1 SECOND TIMESTAMPS USING TIME PERIODS\n    SELECT\n    DATEADD('SECOND', ROW_NUMBER() OVER (ORDER BY SEQ8()) - 1, '2024-01-01')::TIMESTAMP_NTZ AS TIMESTAMP,\n    '/IOT/SENSOR/TAG101' AS TAGNAME\n    FROM TABLE(GENERATOR(ROWCOUNT =&gt; $TIME_PERIODS))\n),\nDATA AS (\n    -- 5 SECOND TAG\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TIMESTAMP &gt;= '2024-01-01 00:00:00'\n    AND TIMESTAMP &lt; '2024-01-01 00:01:00'\n    AND TAGNAME = '/IOT/SENSOR/TAG101'\n)\nSELECT TIMES.TIMESTAMP,\n    A.TAGNAME AS TAGNAME,\n    L.VALUE,\n    A.VALUE AS LOCF_VALUE\nFROM TIMES\nLEFT JOIN DATA L ON TIMES.TIMESTAMP = L.TIMESTAMP AND TIMES.TAGNAME = L.TAGNAME\nASOF JOIN DATA A MATCH_CONDITION(TIMES.TIMESTAMP &gt;= A.TIMESTAMP) ON TIMES.TAGNAME = A.TAGNAME\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_gapfill_locf.png\" alt=\"assets/analysis_query_gapfill_locf.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ETime Series Forecasting\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting\"\u003ETime-Series Forecasting\u003C/a\u003E\u003C/strong\u003E employs a machine learning (ML) algorithm to predict future data by using historical time series data.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EForecasting\u003C/strong\u003E is part of \u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/guides-overview-ml-functions#time-series-functions\"\u003EML Functions\u003C/a\u003E in Snowflake Cortex, Snowflake&rsquo;s intelligent, fully-managed AI and ML service\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EForecasting\u003C/strong\u003E: Consider a use case where you want to \u003Cstrong\u003Epredict expected production output\u003C/strong\u003E based on a flow sensor. In this case, you could \u003Cstrong\u003Egenerate a time series forecast\u003C/strong\u003E for a single tag looking forward one day for a flow sensor.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003ECreate a forecast \u003Cstrong\u003Etraining data set\u003C/strong\u003E from historical data.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* FORECAST DATA - Training Data Set - /IOT/SENSOR/TAG401\nA single tag of data for two weeks.\n\n1 - Create a forecast training data set from historical data. This will use a temporary table.\n*/\nCREATE OR REPLACE TEMPORARY TABLE HOL_TIMESERIES.ANALYTICS.TEMP_TS_TAG_TRAIN AS\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME = '/IOT/SENSOR/TAG401'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003ECreate a Time-Series \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/classes/forecast/commands/create-forecast\"\u003ESNOWFLAKE.ML.FORECAST\u003C/a\u003E model using the training data set.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* FORECAST MODEL - Training Data Set - /IOT/SENSOR/TAG401\n2 - Create a Time-Series SNOWFLAKE.ML.FORECAST model using the training data set.\n\nINPUT_DATA - The data set used for training the forecast model\nSERIES_COLUMN - The column that splits multiple series of data, such as different TAGNAMES\nTIMESTAMP_COLNAME - The column containing the Time Series times\nTARGET_COLNAME - The column containing the target value\n\nTraining the Time Series Forecast model may take 2-3 minutes in this case.\n*/\nCREATE OR REPLACE SNOWFLAKE.ML.FORECAST HOL_TIMESERIES_FORECAST(\n    INPUT_DATA =&gt; SYSTEM$REFERENCE('TABLE', 'HOL_TIMESERIES.ANALYTICS.TEMP_TS_TAG_TRAIN'),\n    SERIES_COLNAME =&gt; 'TAGNAME',\n    TIMESTAMP_COLNAME =&gt; 'TIMESTAMP',\n    TARGET_COLNAME =&gt; 'VALUE'\n);\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETraining the Time Series Forecast model\u003C/strong\u003E may take 2-3 minutes in this case. Indicative training times available at \u003Ca href=\"https://docs.snowflake.com/user-guide/snowflake-cortex/ml-functions/forecasting#training-on-multi-series-data\"\u003ETraining on Multi-Series Data\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003ETest Forecasting model output for one day.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* FORECAST MODEL OUTPUT - Forecast for 1 Day\n3 - Test Forecasting model output for one day.\n\nSERIES_VALUE - Defines the series being forecasted - for example the specific tag\nFORECASTING_PERIODS - The number of periods being forecasted\n*/\nCALL HOL_TIMESERIES_FORECAST!FORECAST(SERIES_VALUE =&gt; TO_VARIANT('/IOT/SENSOR/TAG401'), FORECASTING_PERIODS =&gt; 1440);\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003ECreate a forecast analysis combining historical data with forecast data using \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/result_scan\"\u003ERESULT_SCAN\u003C/a\u003E.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* FORECAST COMBINED - Combined ACTUAL and FORECAST data\n4 - Create a forecast analysis combining historical data with forecast data.\n\nUNION the historical ACTUAL data with the FORECAST data using RESULT_SCAN\n*/\nSELECT\n    'ACTUAL' AS DATASET,\n    TAGNAME,\n    TIMESTAMP,\n    VALUE,\n    NULL AS FORECAST,\n    NULL AS UPPER\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME = '/IOT/SENSOR/TAG401'\nAND TO_DATE(TIMESTAMP) = '2024-01-14'\nUNION ALL\nSELECT\n    'FORECAST' AS DATASET,\n    SERIES AS TAGNAME,\n    TS AS TIMESTAMP,\n    NULL AS VALUE,\n    FORECAST,\n    UPPER_BOUND AS UPPER\nFROM TABLE(RESULT_SCAN(-1))\nORDER BY DATASET, TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003ECHART: Time Series Forecast\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data set the first column to \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect the \u003Ccode\u003ETIMESTAMP\u003C/code\u003E column and set the Bucketing to \u003Ccode\u003EMinute\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003EFORECAST\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe chart will show a flow sensor with ACTUALS and FORECAST values\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_forecast.png\" alt=\"assets/analysis_chart_forecast.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EAsk Copilot\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-copilot\"\u003ESnowflake Copilot\u003C/a\u003E\u003C/strong\u003E is an \u003Cstrong\u003ELLM-powered assistant\u003C/strong\u003E that simplifies data analysis while maintaining robust data governance, and seamlessly integrates into your existing Snowflake workflow.\u003C/p\u003E\n","\u003Cp\u003ESnowflake Copilot is \u003Cstrong\u003Epowered by a model fine-tuned by Snowflake that runs securely inside Snowflake Cortex\u003C/strong\u003E, Snowflake&rsquo;s intelligent, fully managed AI service. Snowflake Copilot uses the names of your databases, schemas, tables, and columns and also the data types of your columns to determine what data is available to query.\u003C/p\u003E\n","\u003Cp\u003ESnowflake Copilot also has access to \u003Ca href=\"https://docs.snowflake.com/\"\u003ESnowflake documentation\u003C/a\u003E and can answer general questions about Snowflake or SQL.\u003C/p\u003E\n","\u003Cp\u003EFor more information, please review \u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-copilot#how-to-use-sf-copilot\"\u003EHow to use Snowflake Copilot\u003C/a\u003E and \u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-copilot#tips-for-using-sf-copilot\"\u003ETips for using Snowflake Copilot\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch4\u003ENOTE: At the time of publishing this lab, in late May 2024, Snowflake Copilot was in Public Preview in AWS US regions. We have included it in the lab content for reference. If you do not see &quot;Ask Copilot&quot;, it may NOT be released in your region just yet. Please review the \u003Ca href=\"https://docs.snowflake.com/en/release-notes/preview-features\"\u003ESnowflake Preview Features\u003C/a\u003E page for more information.\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003EAt the top left of the screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newsheet.png\" alt=\"assets/analysis_newsheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EAt the bottom right of the worksheet, click the \u003Cstrong\u003EAsk Copilot\u003C/strong\u003E button.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_askcopilot.png\" alt=\"assets/analysis_askcopilot.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EA \u003Cstrong\u003ESnowflake Copilot\u003C/strong\u003E tab will appear to the right of the window, at the bottom click \u003Cstrong\u003ESelect Database\u003C/strong\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_selectdatabase.png\" alt=\"assets/analysis_selectdatabase.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003ESelect the database and schema \u003Ccode\u003EHOL_TIMESERIES &gt; ANALYTICS\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_database_analytics.png\" alt=\"assets/analysis_database_analytics.png\"\u003E\u003C/p\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETry asking Snowflake Copilot the following prompts\u003C/strong\u003E, by entering them into the text prompt box. Snowflake Copilot will return a \u003Cstrong\u003Egenerated SQL query along with annotations\u003C/strong\u003E of how it structures the SQL query.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EShow me namespace, tag name, time, and latest value for tag /IOT/SENSOR/TAG301\u003C/li\u003E\u003Cli\u003EShow me the average values by namespace and tag name\u003C/li\u003E\u003Cli\u003EShow me the max value, and time for tag name /IOT/SENSOR/TAG101 on January 10 2024 by tag name\u003C/li\u003E\u003Cli\u003EShow me 1hr averages for tag /IOT/SENSOR/TAG301 on January 3 2024 by tag\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot.png\" alt=\"assets/analysis_query_copilot.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIf \u003Cstrong\u003ESnowflake Copilot\u003C/strong\u003E is in the process of indexing objects, results will return \u003Cstrong\u003E&quot;We are in the process of indexing the tables and views in the selected database and schema. Please try again later.&quot;\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003EClick the \u003Ccode\u003ERun\u003C/code\u003E button below the generated SQL query. If it's correct, please give the generated prompt output a \u003Cstrong\u003Ethumbs up\u003C/strong\u003E!\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot_run.png\" alt=\"assets/analysis_query_copilot_run.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECopilot\u003C/strong\u003E will execute the SQL in the worksheet.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot_hourlybin.png\" alt=\"assets/analysis_query_copilot_hourlybin.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EIf you encounter issues in the \u003Cstrong\u003ETime Series Analysis\u003C/strong\u003E section, use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003ERANGE BETWEEN Query Returning Error: Invalid window frame\u003C/h4\u003E\n","\u003Cp\u003EAt the time of publishing this lab, in late May 2024, the RANGE BETWEEN function was in Private Preview. We have included it in the lab content for reference. If you receive errors when running the RANGE BETWEEN queries, it may NOT be released in your region just yet, it is targeted to be Public Preview soon. Please review the \u003Ca href=\"https://docs.snowflake.com/en/release-notes/preview-features\"\u003ESnowflake Preview Features\u003C/a\u003E page for more information.\u003C/p\u003E\n","\u003Ch4\u003E&quot;Ask Copilot&quot; is NOT Showing in Worksheets\u003C/h4\u003E\n","\u003Cp\u003EAt the time of publishing this lab, in late May 2024, Snowflake Copilot was in Public Preview in AWS US regions. We have included it in the lab content for reference. If you do not see &quot;Ask Copilot&quot;, it may NOT be released in your region just yet. Please review the \u003Ca href=\"https://docs.snowflake.com/en/release-notes/preview-features\"\u003ESnowflake Preview Features\u003C/a\u003E page for more information.\u003C/p\u003E\n","\u003Ch4\u003ESnowflake Copilot Returns &quot;We are in the process of indexing the tables and views in the selected database and schema. Please try again later.&quot;\u003C/h4\u003E\n","\u003Cp\u003EIf Snowflake Copilot is in the process of indexing objects, results will return &quot;We are in the process of indexing the tables and views in the selected database and schema. Please try again later.&quot;.\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EBuild Your Own Time Series Functions\u003C/h2\u003E\n","\u003Cp\u003ENow that you have a great understanding of running \u003Cstrong\u003ETime Series Analysis\u003C/strong\u003E, we will now look at deploying time series \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/udf-overview\"\u003EUser Defined Table Functions (UDTF)\u003C/a\u003E that can query time series data in a re-usable manner. Table functions will accept a set of input parameters and perform operations on a data set, and return results in a table format.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/byo_functions.png\" alt=\"assets/byo_functions.png\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EINFO: Time Series Query Profiles\u003C/h4\u003E\n","\u003Cp\u003EThe following query profiles will be covered in this section.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EQuery Type\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EFunctions\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EDescription\u003C/strong\u003E\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EUpsampling / Interpolation\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECustom Interpolation Table Function\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ETime binning aggregations with interpolated values over time intervals.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDownsampling - LTTB\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ECustom Snowpark Downsampling Table Function\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EDownsampling to a set number of data points whilst retaining the shape and variability of the time series data.\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003ETable Functions Deploy\u003C/h3\u003E\n","\u003Cp\u003EIn this section we'll deploy two types of Time Series \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/udf-overview\"\u003EUser-Defined Table Functions (UDTF)\u003C/a\u003E that will be used to \u003Cstrong\u003Eresample time series data\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EFunction 1 - SQL - Interpolation / Upsampling Time Series Data\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUpsampling\u003C/strong\u003E is used to \u003Cstrong\u003Eincrease the frequency\u003C/strong\u003E of time samples, such as from hours to minutes, by placing time series data into fixed time intervals using aggregate operations on the values within each time interval. Due to the frequency of samples being increased it has the effect of \u003Cstrong\u003Ecreating new values if the interval is more frequent\u003C/strong\u003E than the data itself.\u003C/p\u003E\n","\u003Cp\u003EIf the interval does not contain a value, it will be \u003Cstrong\u003Einterpolated from the surrounding aggregated data\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EFunction 2 - Python - Downsampling Time Series Data\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDownsampling\u003C/strong\u003E is used to \u003Cstrong\u003Edecrease the frequency\u003C/strong\u003E of time samples, such as from seconds to minutes. For the downsampling table function, we will deploy the \u003Cstrong\u003ELargest Triangle Three Buckets (LTTB)\u003C/strong\u003E downsampling algorithm, which is part of the \u003Cstrong\u003E\u003Ca href=\"https://repo.anaconda.com/pkgs/snowflake/\"\u003ESnowpark Python\u003C/a\u003E - plotly-resampler\u003C/strong\u003E package.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ELTTB\u003C/strong\u003E algorithm \u003Cstrong\u003Ereduces the number of visual data points in a time series data set, whilst retaining the shape and variability of the time series data\u003C/strong\u003E. It's useful for reducing large time series data sets for charting purposes where the consumer system may have reduced memory resources.\u003C/p\u003E\n","\u003Ch3\u003EStep 1 - Deploy Time Series Functions and Procedures\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_5_functions.sql\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EClick the \u003Ccode\u003EExecute All Statements\u003C/code\u003E button at the top right of the worksheet to \u003Cstrong\u003Edeploy all functions and procedures\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_info_runall.png\" alt=\"assets/function_info_runall.png\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EINFO: Time Series Functions and Procedures\u003C/h4\u003E\n","\u003Cp\u003EThe following functions and procedures have been deployed.\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: SQL INTERPOLATE Table Function\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EINTERPOLATE Table Function\u003C/strong\u003E is using the \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/constructs/asof-join\"\u003EASOF JOIN\u003C/a\u003E for each time interval to \u003Cstrong\u003Elook both backwards (LAST_VALUE) and forwards (NEXT_VALUE) in time\u003C/strong\u003E, to calculate the time and value difference at each time interval, which is then used to generate a smooth linear interpolated value.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EINTERPOLATE Table Function\u003C/strong\u003E will return both \u003Cstrong\u003Elinear interpolated values\u003C/strong\u003E and \u003Cstrong\u003Elast observed value carried forward (LOCF) values\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- Create Interpolate Table Function\n##############################*/\nCREATE OR REPLACE FUNCTION HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE (\n    V_TAGLIST VARCHAR,\n    V_START_TIMESTAMP TIMESTAMP_NTZ,\n    V_END_TIMESTAMP TIMESTAMP_NTZ,\n    V_INTERVAL NUMBER,\n    V_BUCKETS NUMBER\n)\nRETURNS TABLE (\n    TIMESTAMP TIMESTAMP_NTZ,\n    TAGNAME VARCHAR,\n    LINEAR_VALUE FLOAT,\n    LOCF_VALUE FLOAT,\n    LAST_TIMESTAMP TIMESTAMP_NTZ\n)\nLANGUAGE SQL\nAS\n$$\nWITH\nTSTAMPS AS (\n    SELECT \n        DATEADD('SEC', V_INTERVAL * ROW_NUMBER() OVER (ORDER BY SEQ8()) - V_INTERVAL, V_START_TIMESTAMP) AS TIMESTAMP\n    FROM TABLE(GENERATOR(ROWCOUNT =&gt; V_BUCKETS))\n),\nTAGLIST AS (\n    SELECT\n        TRIM(TAGLIST.VALUE) AS TAGNAME\n    FROM\n        TABLE(SPLIT_TO_TABLE(V_TAGLIST, ',')) TAGLIST\n),\nTIMES AS (\n    SELECT\n        TSTAMPS.TIMESTAMP,\n        TAGLIST.TAGNAME\n    FROM\n        TSTAMPS\n        CROSS JOIN TAGLIST\n),\nLAST_VALUE AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        RAW_DATA.TIMESTAMP RAW_TS,\n        RAW_DATA.TAGNAME,\n        RAW_DATA.VALUE_NUMERIC\n    FROM\n        TIMES ASOF JOIN HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS RAW_DATA\n            MATCH_CONDITION(TIMES.TIMESTAMP &gt;= RAW_DATA.TIMESTAMP)\n            ON TIMES.TAGNAME = RAW_DATA.TAGNAME\n    WHERE\n        RAW_DATA.TIMESTAMP &gt;= V_START_TIMESTAMP\n    AND RAW_DATA.TIMESTAMP &lt;= V_END_TIMESTAMP\n),\nNEXT_VALUE AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        RAW_DATA.TIMESTAMP RAW_TS,\n        RAW_DATA.TAGNAME,\n        RAW_DATA.VALUE_NUMERIC\n    FROM\n        TIMES ASOF JOIN HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS RAW_DATA\n            MATCH_CONDITION(TIMES.TIMESTAMP &lt;= RAW_DATA.TIMESTAMP)\n            ON TIMES.TAGNAME = RAW_DATA.TAGNAME\n    WHERE\n        RAW_DATA.TIMESTAMP &gt;= V_START_TIMESTAMP\n    AND RAW_DATA.TIMESTAMP &lt;= V_END_TIMESTAMP\n),\nCOMB_VALUES AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        TIMES.TAGNAME,\n        LV.VALUE_NUMERIC LAST_VAL,\n        LV.TIMESTAMP LV_TS,\n        LV.RAW_TS LV_RAW_TS,\n        NV.VALUE_NUMERIC NEXT_VAL,\n        NV.TIMESTAMP NV_TS,\n        NV.RAW_TS NV_RAW_TS\n    FROM TIMES\n    INNER JOIN LAST_VALUE LV ON TIMES.TIMESTAMP = LV.TIMESTAMP AND TIMES.TAGNAME = LV.TAGNAME\n    INNER JOIN NEXT_VALUE NV ON TIMES.TIMESTAMP = NV.TIMESTAMP AND TIMES.TAGNAME = NV.TAGNAME\n),\nINTERP AS (\n    SELECT\n        TIMESTAMP,\n        TAGNAME,\n        TIMESTAMPDIFF(SECOND, LV_RAW_TS, NV_RAW_TS) TDIF_BASE,\n        TIMESTAMPDIFF(SECOND, LV_RAW_TS, TIMESTAMP) TDIF,\n        LV_TS,\n        NV_TS,\n        LV_RAW_TS,\n        LAST_VAL,\n        NEXT_VAL,\n        DECODE(TDIF, 0, LAST_VAL, LAST_VAL + (NEXT_VAL - LAST_VAL) / TDIF_BASE * TDIF) IVAL\n    FROM\n        COMB_VALUES\n)\nSELECT\n    TIMESTAMP,\n    TAGNAME,\n    IVAL LINEAR_VALUE,\n    LAST_VAL LOCF_VALUE,\n    LV_RAW_TS LAST_TIMESTAMP\nFROM\n    INTERP\n$$;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: SQL INTERPOLATE Procedure\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EINTERPOLATE Procedure\u003C/strong\u003E can calculate the number of time buckets within a time boundary based on the interval specified. It then calls the \u003Cstrong\u003EINTERPOLATE\u003C/strong\u003E table function, and depending on the \u003Cstrong\u003EV_INTERP_TYPE\u003C/strong\u003E variable, it will return either the linear interpolated values or last observed value carried forward (LOCF). \u003Cstrong\u003EDefault is LOCF\u003C/strong\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- Create Interpolate Procedure\n-- Interpolate helper procedure to accept start and end times, and return either LOCF or Linear Interpolated Values\n##############################*/\nCREATE OR REPLACE PROCEDURE HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE (\n    V_TAGLIST VARCHAR,\n    V_FROM_TIME TIMESTAMP_NTZ,\n    V_TO_TIME TIMESTAMP_NTZ,\n    V_INTERVAL NUMBER,\n    V_INTERP_TYPE VARCHAR\n)\nRETURNS TABLE (\n    TIMESTAMP TIMESTAMP_NTZ,\n    TAGNAME VARCHAR,\n    VALUE FLOAT\n)\nLANGUAGE SQL\nAS\n$$\nDECLARE\nTIME_BUCKETS NUMBER;\nRES RESULTSET;\nBEGIN\n    TIME_BUCKETS := CEIL((TIMESTAMPDIFF('SEC', :V_FROM_TIME, :V_TO_TIME) + 1) / :V_INTERVAL);\n\n    IF (:V_INTERP_TYPE = 'LINEAR') THEN\n        -- LINEAR\n        RES := (SELECT TIMESTAMP, TAGNAME, LINEAR_VALUE AS VALUE FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE(:V_TAGLIST, :V_FROM_TIME, :V_TO_TIME, :V_INTERVAL, :TIME_BUCKETS)) ORDER BY TAGNAME, TIMESTAMP);\n    ELSE\n        -- LOCF\n        RES := (SELECT TIMESTAMP, TAGNAME, LOCF_VALUE AS VALUE FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE(:V_TAGLIST, :V_FROM_TIME, :V_TO_TIME, :V_INTERVAL, :TIME_BUCKETS)) ORDER BY TAGNAME, TIMESTAMP);\n    END IF;\n\n    RETURN TABLE(RES);\nEND;\n$$;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Python Largest Triangle Three Buckets (LTTB) Function\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ELargest Triangle Three Buckets (LTTB) downsampling\u003C/strong\u003E function uses a \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-tabular-vectorized\"\u003EVectorized Python UDTF\u003C/a\u003E with an LTTB handler built using the \u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-tabular-vectorized\"\u003ESnowpark Python\u003C/a\u003E - plotly-resampler\u003C/strong\u003E package. The \u003Cstrong\u003ELTTB\u003C/strong\u003E algorithm \u003Cstrong\u003Ereduces the number of visual data points in a time series data set, whilst retaining the shape and variability of the time series data\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELTTB\u003C/strong\u003E package is available in the \u003Ca href=\"https://repo.anaconda.com/pkgs/snowflake/\"\u003EAnaconda Snowflake Snowpark for Python Channel\u003C/a\u003E via \u003Cstrong\u003Eplotly-resampler\u003C/strong\u003E and runs securely inside Snowflake warehouses when executed.\u003C/p\u003E\n","\u003Cp\u003EThe original code for LTTB is available at \u003Ca href=\"https://github.com/sveinn-steinarsson/flot-downsample\"\u003ESveinn Steinarsson - GitHub\u003C/a\u003E.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##############################\n-- LTTB Downsampling Table Function\n##############################*/\nCREATE OR REPLACE FUNCTION HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_LTTB (\n    TIMESTAMP NUMBER,\n    VALUE FLOAT,\n    SIZE NUMBER\n) \nRETURNS TABLE (\n    TIMESTAMP NUMBER,\n    VALUE FLOAT\n)\nLANGUAGE PYTHON\nRUNTIME_VERSION = 3.11\nPACKAGES = ('pandas', 'plotly-resampler')\nHANDLER = 'lttb_run'\nAS $$\nfrom _snowflake import vectorized\nimport pandas as pd\nfrom plotly_resampler.aggregation.algorithms.lttb_py import LTTB_core_py\n\nclass lttb_run:\n    @vectorized(input=pd.DataFrame)\n\n    def end_partition(self, df):\n        if df.SIZE.iat[0] &gt;= len(df.index):\n            return df[['TIMESTAMP','VALUE']]\n        else:\n            idx = LTTB_core_py.downsample(\n                df.TIMESTAMP.to_numpy(),\n                df.VALUE.to_numpy(),\n                n_out=df.SIZE.iat[0]\n            )\n            return df[['TIMESTAMP','VALUE']].iloc[idx]\n$$;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EStep 2 - Copy Worksheet Content To Snowsight Worksheet\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWith the functions deployed, we can look at using them to query time series data\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EThis section will be executed within a Snowflake Snowsight Worksheet\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_6_function_queries.sql\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECopy\u003C/strong\u003E the contents of the worksheet to \u003Cstrong\u003Eclipboard\u003C/strong\u003E, and paste it into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch3\u003EStep 3 - Query Time Series Data Using Deployed Functions and Procedures\u003C/h3\u003E\n","\u003Ch3\u003ESet Session Context\u003C/h3\u003E\n","\u003Cp\u003ERun the following three statements to ensure the worksheet session is in the right context.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch3\u003EUpsampling / Interpolation Query\u003C/h3\u003E\n","\u003Cp\u003EUpsampling is used to \u003Cstrong\u003Eincrease the frequency of time samples\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003EThe first set of queries use the \u003Cstrong\u003EINTERPOLATE table functions and procedures\u003C/strong\u003E\nto produce values for upsampling both \u003Cstrong\u003Elast observed values carried forward (LOCF)\u003C/strong\u003E and\n\u003Cstrong\u003ELINEAR interpolated smoothing\u003C/strong\u003E values between data points.\u003C/p\u003E\n","\u003Cp\u003ECall the interpolate table function to return both the \u003Cstrong\u003Elinear interpolated values and last observed value carried forward (LOCF)\u003C/strong\u003E.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n/* INTERPOLATE TABLE FUNCTION\nCall the interpolate table function to return both the linear interpolated values and last observed value carried forward (LOCF).\n*/\nSELECT * FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE('/IOT/SENSOR/TAG401', '2024-01-01 12:10:00'::TIMESTAMP_NTZ, '2024-01-01 13:10:00'::TIMESTAMP_NTZ, 10, 362)) ORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_query_direct.png\" alt=\"assets/function_query_direct.png\"\u003E\u003C/p\u003E\n","\u003Ch5\u003ECHART: Interpolation - Linear and LOCF\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003ETIMESTAMP\u003C/code\u003E and set Bucketing to \u003Ccode\u003ESecond\u003C/code\u003E\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003ELINEAR_VALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003ESelect \u003Ccode\u003E+ Add column\u003C/code\u003E and select \u003Ccode\u003ELOCF_VALUE\u003C/code\u003E and set Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe chart will display both LINEAR and LOCF for interpolated values between data points\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_linearlocf.png\" alt=\"assets/function_chart_linearlocf.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EInterpolation - Last Observed Value Carried Forward (LOCF) Query\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EInterpolation Procedure\u003C/strong\u003E will accept a start time and end time, along with a bucket interval size in seconds.\u003C/p\u003E\n","\u003Cp\u003EIt will then calculate the number of buckets within the time boundary, and call the Interpolate table function.\u003C/p\u003E\n","\u003Cp\u003ECall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with \u003Ccode\u003ELOCF\u003C/code\u003E Interpolate type.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* INTERPOLATE PROCEDURE - LOCF\nThe Interpolation Procedure will accept a start time and end time, along with a bucket interval size in seconds.\n\nIt will then calculate the number of buckets within the time boundary, and call the Interpolate table function.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LOCF` Interpolate type.\n*/\nCALL HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE(\n    -- V_TAGLIST\n    '/IOT/SENSOR/TAG401',\n    -- V_FROM_TIME\n    '2024-01-01 12:10:00',\n    -- V_TO_TIME\n    '2024-01-01 13:10:00',\n    -- V_INTERVAL\n    10,\n    -- V_INTERP_TYPE\n    'LOCF'\n);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003ECHART: Interpolation - LOCF\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe chart will display a LOCF value where the prior value is interpolated between data points\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_locf.png\" alt=\"assets/function_chart_locf.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EInterpolation - Linear Query\u003C/h3\u003E\n","\u003Cp\u003ESimilar to the LOCF interpolation procedure call, this will create a \u003Cstrong\u003ELINEAR Interpolation\u003C/strong\u003E table.\u003C/p\u003E\n","\u003Cp\u003ECall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with \u003Ccode\u003ELINEAR\u003C/code\u003E Interpolate type.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* INTERPOLATE PROCEDURE - LINEAR\nSimilar to the LOCF interpolation procedure call, this will create a Linear Interpolation table.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LINEAR` Interpolate type.\n*/\nCALL HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE(\n    -- V_TAGLIST\n    '/IOT/SENSOR/TAG401',\n    -- V_FROM_TIME\n    '2024-01-01 12:10:00',\n    -- V_TO_TIME\n    '2024-01-01 13:10:00',\n    -- V_INTERVAL\n    10,\n    -- V_INTERP_TYPE\n    'LINEAR'\n);\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003ECHART: Interpolation - Linear\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe chart will display a smoother LINEAR interpolated value between data points\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_linear.png\" alt=\"assets/function_chart_linear.png\"\u003E\u003C/p\u003E\n","\u003Ch3\u003ELTTB Query\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ELargest Triangle Three Buckets (LTTB)\u003C/strong\u003E algorithm is a time series downsampling algorithm that reduces the number of visual data points, whilst retaining the shape and variability of the time series data.\u003C/p\u003E\n","\u003Cp\u003EStarting with a \u003Cstrong\u003ERAW\u003C/strong\u003E query we can see the \u003Cstrong\u003ELTTB\u003C/strong\u003E function in action, where the function will \u003Cstrong\u003Edownsample two hours of data for a one second tag\u003C/strong\u003E, 7200 data points downsampled to 500 data points whilst keeping the shape and variability of the values.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERAW Query\u003C/strong\u003E\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* RAW - 2 HOURS OF 1 SEC DATA\nSource of downsample - 7200 data points\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC as VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP &gt; '2024-01-09 21:00:00'\nAND TIMESTAMP &lt;= '2024-01-09 23:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003ECHART: RAW Query\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003ETIMESTAMP\u003C/code\u003E and set the Bucketing to \u003Ccode\u003ESecond\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003E7200 Data Points\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_lttb_raw.png\" alt=\"assets/function_chart_lttb_raw.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELTTB Query\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EWe can now pass the same data into the \u003Cstrong\u003ELTTB table function\u003C/strong\u003E and request 500 data points to be returned.\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/* LTTB - DOWNSAMPLE TO 500 DATA POINTS\nWe can now pass the same data into the LTTB table function and request 500 data points to be returned.\n\nThe DATA subquery sets up the data set, and this is cross joined with the LTTB table function,\nwith an input of TIMESTAMP, VALUE, and the downsample size of 500.\n*/\nSELECT DATA.TAGNAME, LTTB.TIMESTAMP::VARCHAR::TIMESTAMP_NTZ AS TIMESTAMP, LTTB.VALUE \nFROM (\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC as VALUE\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TIMESTAMP &gt; '2024-01-09 21:00:00'\n    AND TIMESTAMP &lt;= '2024-01-09 23:00:00'\n    AND TAGNAME = '/IOT/SENSOR/TAG301'\n) AS DATA \nCROSS JOIN TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_LTTB(DATE_PART(EPOCH_NANOSECOND, DATA.TIMESTAMP), DATA.VALUE, 500) OVER (PARTITION BY DATA.TAGNAME ORDER BY DATA.TIMESTAMP)) AS LTTB\nORDER BY TAGNAME, TIMESTAMP;\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Ch5\u003ECHART: LTTB Query\u003C/h5\u003E\n\u003Col\u003E\u003Cli\u003ESelect the \u003Ccode\u003EChart\u003C/code\u003E sub tab below the worksheet.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003EVALUE\u003C/code\u003E and set the Aggregation to \u003Ccode\u003EMax\u003C/code\u003E.\u003C/li\u003E\u003Cli\u003EUnder Data select \u003Ccode\u003ETIMESTAMP\u003C/code\u003E and set the Bucketing to \u003Ccode\u003ESecond\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cstrong\u003E500 Data Points - The shape and variability of the values are retained, when compared to the 7200 data point RAW chart\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_lttb_downsampled.png\" alt=\"assets/function_chart_lttb_downsampled.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EYou have now built your own \u003Cstrong\u003ETime Series Analysis\u003C/strong\u003E functions and procedures, these can be called within applications working with time series data. We can now look at deploying a Time Series application.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EThis section runs through a \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E, this can be run in Snowflake with a \u003Cstrong\u003ESnowsight Worksheet\u003C/strong\u003E. Use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EInside the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E folder open \u003Ccode\u003Eworksheets/hol_timeseries_5_functions.sql\u003C/code\u003E and \u003Cstrong\u003Ecopy\u003C/strong\u003E the contents of the file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPaste\u003C/strong\u003E the copied content into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun\u003C/strong\u003E all the commands in the worksheet.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EBuild Your Time Series Application in Streamlit\u003C/h2\u003E\n","\u003Cp\u003EAfter completing the analysis of the time series data that was streamed into Snowflake, we are now ready to \u003Cstrong\u003Edeliver a Time Series Analytics application\u003C/strong\u003E for end users to easily consume time series data. For this purpose we are going to use a \u003Cstrong\u003EStreamlit in Snowflake\u003C/strong\u003E application, deployed using \u003Cstrong\u003ESnowflake CLI\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_overview.png\" alt=\"assets/streamlit_overview.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Streamlit\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EStreamlit\u003C/strong\u003E is an open-source Python library that makes it easy to \u003Cstrong\u003Ecreate web applications for machine learning, data analysis, and visualization\u003C/strong\u003E. \u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit\"\u003EStreamlit in Snowflake\u003C/a\u003E\u003C/strong\u003E helps developers securely build, deploy, and share \u003Cstrong\u003EStreamlit apps on Snowflake&rsquo;s data cloud platform\u003C/strong\u003E, without moving data or application code to an external system.\u003C/p\u003E\n","\u003Ch4\u003EINFO: Snowflake CLI\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/introduction/introduction\"\u003ESnowflake CLI\u003C/a\u003E\u003C/strong\u003E is an open-source command-line tool designed for developers to \u003Cstrong\u003Eeasily create, deploy, update, and view apps running on Snowflake\u003C/strong\u003E. We will use Snowflake CLI to deploy the \u003Cstrong\u003ETime Series Streamlit application\u003C/strong\u003E to your Snowflake account.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 1 - Setup Snowflake Stage for Streamlit Application\u003C/h3\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_7_streamlit.sql\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERun the Worksheet to \u003Cstrong\u003Ecreate a stage for the Streamlit\u003C/strong\u003E application\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##### STREAMLIT SCRIPT #####*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Create a stage for Streamlit\nCREATE OR REPLACE STAGE HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT\nDIRECTORY = (ENABLE = TRUE, REFRESH_ON_CREATE = TRUE)\nENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n\n/*###### EXTERNAL ACTIVITY #####\nUse Snowflake CLI to upload Streamlit app:\n$ conda activate hol-timeseries\n$ snow --config-file=&quot;.snowflake/config.toml&quot; streamlit deploy --replace --project &quot;streamlit&quot; --connection=&quot;hol-timeseries-streamlit&quot;\n##############################*/\n\n/*##### STREAMLIT SCRIPT #####*/\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThere are \u003Cstrong\u003EEXTERNAL ACTIVITY\u003C/strong\u003E sections in the worksheet, this will be covered in the next step.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Pre-Built Streamlit Application\u003C/h4\u003E\n","\u003Cp\u003EA pre-built \u003Cstrong\u003EStreamlit Application\u003C/strong\u003E has been provided as part of this lab. It is located in the \u003Ccode\u003Estreamlit\u003C/code\u003E \u003Cstrong\u003Eproject\u003C/strong\u003E folder of the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E repository.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 2 - Deploy Streamlit Application to Snowflake\u003C/h3\u003E\n","\u003Cp\u003EIn this step, we will now deploy the Streamlit application on the Snowflake account using \u003Cstrong\u003ESnowflake CLI\u003C/strong\u003E.\u003C/p\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Ccode\u003EMenu &gt; Terminal &gt; New Terminal\u003C/code\u003E - a new terminal window will now open\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png\" alt=\"assets/labsetup_newterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EActivate \u003Ccode\u003Ehol-timeseries\u003C/code\u003E python virtual environment by running \u003Ccode\u003Econda activate hol-timeseries\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Econda activate hol-timeseries\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png\" alt=\"assets/labsetup_condaactivate.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png\" alt=\"assets/labsetup_condaactivated.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\u003Cstrong\u003ECopy and run\u003C/strong\u003E the following Snowflake CLI command \u003Cstrong\u003Einto the Terminal\u003C/strong\u003E to deploy the Streamlit application\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow --config-file=&quot;.snowflake/config.toml&quot; streamlit deploy --replace --project &quot;streamlit&quot; --connection=&quot;hol-timeseries-streamlit&quot;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EGitHub Codespace\u003C/strong\u003E may prompt to access the clipboard in \u003Cstrong\u003EVSCode\u003C/strong\u003E, select \u003Cstrong\u003EAllow\u003C/strong\u003E if prompted.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_codespace_paste.png\" alt=\"assets/streamlit_codespace_paste.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Streamlit Deploy with Snowflake CLI\u003C/h4\u003E\n","\u003Cp\u003EThis command does the following:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDeploys the Streamlit application\u003C/strong\u003E using the Snowflake account details mentioned in the &quot;.snowflake/config.toml&quot; file\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E--config-file\u003C/strong\u003E option provides the location of the config file that \u003Cstrong\u003Econtains Snowflake account details\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E--replace\u003C/strong\u003E option ensures that the \u003Cstrong\u003Eexisting application, if present, is overwritten\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E--project\u003C/strong\u003E option provides the \u003Cstrong\u003Epath where the Streamlit app project resides\u003C/strong\u003E\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003E--connection\u003C/strong\u003E option dictates \u003Cstrong\u003Ewhich connection section from the &quot;.snowflake/config.toml&quot;\u003C/strong\u003E file should be used for deployment\u003C/li\u003E\u003C/ul\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 3 - Launch the Streamlit Application\u003C/h3\u003E\n","\u003Cp\u003EOnce the Streamlit application is successfully deployed, Snowflake CLI will display the message \u003Cstrong\u003E&quot;Streamlit successfully deployed and available&quot;\u003C/strong\u003E and will provide the URL for the Streamlit application.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_launch.png\" alt=\"assets/streamlit_launch.png\"\u003E\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EPress \u003Cstrong\u003ECommand/Ctrl\u003C/strong\u003E and \u003Cstrong\u003Eclick the URL\u003C/strong\u003E link to launch the Streamlit application in a new tab. Alternatively, copy and paste the URL into a new tab.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect \u003Ccode\u003EOpen\u003C/code\u003E once prompted.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_open.png\" alt=\"assets/streamlit_open.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Launch Streamlit Apps inside Snowflake\u003C/h4\u003E\n","\u003Cp\u003EYou can also launch \u003Cstrong\u003EStreamlit Applications\u003C/strong\u003E from inside Snowflake by going to \u003Ccode\u003EProjects &gt; Streamlit\u003C/code\u003E and opening the \u003Ccode\u003EHOL_TIMESERIES_STREAMLIT\u003C/code\u003E application.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_open_snowsight.png\" alt=\"assets/streamlit_open_snowsight.png\"\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 4 - Understanding the Streamlit Application\u003C/h3\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003EStreamlit in Snowflake\u003C/strong\u003E application contains several \u003Cstrong\u003Epages\u003C/strong\u003E, accessible via the left menu, that cover various Time Series queries.\u003C/p\u003E\n","\u003Ch4\u003EStreamlit Pages\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERaw\u003C/strong\u003E Time Series Data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EStatistical Aggregate\u003C/strong\u003E Time Series Data\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETime Binning / Downsampling\u003C/strong\u003E Time Series Data\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_summary.gif\" alt=\"assets/streamlit_video_summary.gif\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EFiltering Menu\u003C/h4\u003E\n","\u003Cp\u003EEach page has a filtering menu to:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003ESelect one or more tags\u003C/li\u003E\u003Cli\u003EChange reporting time selection\u003C/li\u003E\u003Cli\u003ESet the sample size of chart visualizations\u003C/li\u003E\u003Cli\u003ESelect various aggregations\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_menu.gif\" alt=\"assets/streamlit_video_menu.gif\"\u003E\u003C/p\u003E\n","\u003Ch4\u003EStreamlit Features\u003C/h4\u003E\n","\u003Cp\u003EAt the bottom of each page there are options to:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESelect\u003C/strong\u003E how much data is displayed in the table along with the order\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDownload as CSV\u003C/strong\u003E - To download the data in CSV file format\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESupporting Detail\u003C/strong\u003E - Shows the queries being run\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERefresh Mode\u003C/strong\u003E - Contains a toggle to enable auto refresh and see new data automatically\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_features.gif\" alt=\"assets/streamlit_video_features.gif\"\u003E\u003C/p\u003E\n","\u003Ch3\u003EStep 5 - Set Streamlit Filters and Query Data\u003C/h3\u003E\n","\u003Ch4\u003EInitial IoT Data Loaded: 1-Jan-2024 to 14-Jan-2024\u003C/h4\u003E\n","\u003Cp\u003EThe initial data set \u003Cstrong\u003Econtains two weeks of data loaded for 1-Jan-2024 to 14-Jan-2024\u003C/strong\u003E. Let's query this using the Streamlit application.\u003C/p\u003E\n","\u003Cp\u003EOpen the \u003Cstrong\u003EStreamlit Application\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Cstrong\u003ETS Raw\u003C/strong\u003E page\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFrom \u003Cstrong\u003ESelect Tag Name\u003C/strong\u003E choose the \u003Ccode\u003E/IOT/SENSOR/TAG101\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor \u003Cstrong\u003EStart Date\u003C/strong\u003E select \u003Ccode\u003E1-Jan-2024\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor \u003Cstrong\u003EStart Time\u003C/strong\u003E select \u003Ccode\u003E00:00\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor \u003Cstrong\u003EEnd Date\u003C/strong\u003E select \u003Ccode\u003E1-Jan-2024\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor \u003Cstrong\u003EEnd Time\u003C/strong\u003E select \u003Ccode\u003E04:00\u003C/code\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_filter.png\" alt=\"assets/streamlit_query_filter.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EStreamlit\u003C/strong\u003E will automatically refresh the page after making filter selections.\u003C/p\u003E\n","\u003Cp\u003EReview the chart and table detail.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData for 1-Jan-2024 should now display\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_raw.png\" alt=\"assets/streamlit_query_raw.png\"\u003E\u003C/p\u003E\n\u003Col start=\"7\"\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Cstrong\u003ETS Aggregates\u003C/strong\u003E page\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe aggregates page will show high level statistical detail for the selected tag and time period.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Cstrong\u003ETS Binning\u003C/strong\u003E page\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe binning page shows a 1 minute downsampled average for the selected tag and time period.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ETry changing the \u003Cstrong\u003ESelect Aggregation Method\u003C/strong\u003E to \u003Ccode\u003EMIN\u003C/code\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThis will now show the 1 minute minimums for the tag and time period.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ETry changing the \u003Cstrong\u003ELabel Position\u003C/strong\u003E to \u003Ccode\u003ESTART\u003C/code\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe \u003Cstrong\u003ETag Data\u003C/strong\u003E table will now show the \u003Cstrong\u003EStart\u003C/strong\u003E timestamp for each minute interval.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003Cblockquote\u003E\n","\u003Ch4\u003EINFO: Tag Data Schema\u003C/h4\u003E\n","\u003Cp\u003EThe \u003Cstrong\u003ETag Data detail tables\u003C/strong\u003E in the Streamlit Application have a \u003Cstrong\u003Eschema\u003C/strong\u003E that returns columns for \u003Cstrong\u003ETAGNAME, TIMESTAMP, and VALUE\u003C/strong\u003E. This is to mimic an \u003Cstrong\u003EAPI data contract\u003C/strong\u003E that will return a consistent schema structure of the data.\u003C/p\u003E\n","\u003Cp\u003EIf an \u003Cstrong\u003Eaggregation has been applied\u003C/strong\u003E to the Tag Data, the \u003Cstrong\u003ETAGNAME will be updated\u003C/strong\u003E to reflect the aggregation and time interval of the data.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_tag_data.png\" alt=\"assets/streamlit_tag_data.png\"\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EStep 6 - Start a Continuous Simulated Stream\u003C/h3\u003E\n","\u003Cp\u003EWe can now \u003Cstrong\u003Estart a continuous stream of data into Snowflake\u003C/strong\u003E, similar to the initial streaming load, to simulate IoT device \u003Cstrong\u003Edata streaming in near real-time\u003C/strong\u003E to Snowflake.\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_streamingclient.png\" alt=\"assets/model_streamingclient.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003EIn the \u003Cstrong\u003EGitHub Codespace VS Code\u003C/strong\u003E:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Ccode\u003EMenu &gt; Terminal &gt; New Terminal\u003C/code\u003E - a new terminal window will now open\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png\" alt=\"assets/labsetup_newterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EChange directory into to the \u003Cstrong\u003Eiotstream\u003C/strong\u003E folder: \u003Ccode\u003Ecd iotstream\u003C/code\u003E\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Ecd iotstream\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003ERun the \u003Ccode\u003ERun_Slooow.sh\u003C/code\u003E script to load the IoT data.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003E./Run_Slooow.sh\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EIf there are no errors, IoT data will now be \u003Cstrong\u003Estreaming into Snowflake\u003C/strong\u003E, and the \u003Cstrong\u003EDynamic Tables\u003C/strong\u003E will start to update.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003EBack \u003Cstrong\u003Ein the Streamlit application\u003C/strong\u003E try enabling \u003Ccode\u003EAuto Refresh\u003C/code\u003E by \u003Ccode\u003EExpanding Refresh Mode &gt; Toggle Auto Refresh\u003C/code\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe charts and data should now start to \u003Cstrong\u003Eautomatically update with new data streaming into Snowflake every minute\u003C/strong\u003E.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_refresh.png\" alt=\"assets/streamlit_refresh.png\"\u003E\u003C/p\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003E\n","\u003Cp\u003ESelect the \u003Cstrong\u003ETS Raw\u003C/strong\u003E page to see the raw data\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ETry adding \u003Ccode\u003E/IOT/SENSOR/TAG401\u003C/code\u003E and \u003Ccode\u003E/IOT/SENSOR/TAG601\u003C/code\u003E to the \u003Cstrong\u003ESelect Tag Names\u003C/strong\u003E filter\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EThe charts and data should now contain two additional tags with the data updating every minute.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_stream.png\" alt=\"assets/streamlit_query_stream.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EYou have now successfully deployed a \u003Cstrong\u003ETime Series Application\u003C/strong\u003E using Streamlit in Snowflake. This will allow end users easy access to visualize time series data as well as run their own \u003Cstrong\u003ETime Series Analysis\u003C/strong\u003E on all Time Series data available in Snowflake.\u003C/p\u003E\n\u003C/blockquote\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EThis section runs through \u003Cstrong\u003Edeploying a Streamlit application using Snowflake CLI in the GitHub Codespace\u003C/strong\u003E. Use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n","\u003Ch4\u003EConfirm Snowflake CLI can Connect to Snowflake\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003EOpen \u003Ccode\u003EMenu &gt; Terminal &gt; New Terminal\u003C/code\u003E - a new terminal window will now open.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png\" alt=\"assets/labsetup_newterminal.png\"\u003E\u003C/p\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EActivate \u003Ccode\u003Ehol-timeseries\u003C/code\u003E python virtual environment by running \u003Ccode\u003Econda activate hol-timeseries\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Econda activate hol-timeseries\n\u003C/code\u003E\u003C/pre\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png\" alt=\"assets/labsetup_condaactivate.png\"\u003E\u003C/p\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png\" alt=\"assets/labsetup_condaactivated.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\u003Cstrong\u003ECopy and run\u003C/strong\u003E the following Snowflake CLI command \u003Cstrong\u003Einto the Terminal\u003C/strong\u003E to deploy the Streamlit application.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-bash\"\u003Esnow --config-file=&quot;.snowflake/config.toml&quot; connection test --connection=&quot;hol-timeseries-streamlit&quot;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Cul\u003E\u003Cli\u003EYou should receive an output with \u003Cstrong\u003EStatus &quot;OK&quot;\u003C/strong\u003E.\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_snowflakecli_conntest.png\" alt=\"assets/troubleshoot_snowflakecli_conntest.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003EIf the \u003Cstrong\u003EStatus is NOT &quot;OK&quot;\u003C/strong\u003E, review the error returned to Troubleshoot further.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERefer to the \u003Cstrong\u003E&quot;Lab Setup&quot;\u003C/strong\u003E section and confirm configuration of \u003Ccode\u003E.snowflake/config.toml\u003C/code\u003E file and \u003Cstrong\u003ESnowflake user\u003C/strong\u003E \u003Ccode\u003Epublic key\u003C/code\u003E setup.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOnce \u003Cstrong\u003ESnowflake CLI\u003C/strong\u003E is connected, re-run this section.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch4\u003EManually Deploy Streamlit Application using SQL\u003C/h4\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EReview \u003Ca href=\"https://docs.snowflake.com/en/developer-guide/streamlit/create-streamlit-sql\"\u003ECreating a Streamlit app by using SQL\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and select \u003Ccode\u003E+ Create &gt; SQL Worksheet\u003C/code\u003E under the Snowflake logo at the top left.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_worksheet.png\" alt=\"assets/troubleshoot_streamlit_files_worksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003E\u003Cstrong\u003ECreate a stage\u003C/strong\u003E using the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E worksheet \u003Ccode\u003Eworksheets/hol_timeseries_7_streamlit.sql\u003C/code\u003E SQL.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Create a stage for Streamlit\nCREATE OR REPLACE STAGE HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT\nDIRECTORY = (ENABLE = TRUE, REFRESH_ON_CREATE = TRUE)\nENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\u003Cstrong\u003EOpen the stage\u003C/strong\u003E by expanding \u003Ccode\u003EData &gt; Databases &gt; HOL_TIMESERIES &gt; ANALYTICS &gt; Stages &gt; STAGE_TS_STREAMLIT\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_stage.png\" alt=\"assets/troubleshoot_streamlit_stage.png\"\u003E\u003C/p\u003E\n\u003Col start=\"5\"\u003E\u003Cli\u003EAt the top right of the stage click the \u003Ccode\u003E+ Files\u003C/code\u003E button.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png\" alt=\"assets/troubleshoot_streamlit_addfiles.png\"\u003E\u003C/p\u003E\n\u003Col start=\"6\"\u003E\u003Cli\u003EIn the \u003Cstrong\u003EUpload Your Files\u003C/strong\u003E window, \u003Cstrong\u003EDrag and Drop\u003C/strong\u003E the following files from \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E under the \u003Ccode\u003Estreamlit\u003C/code\u003E folder, and set the \u003Ccode\u003ESpecify the path\u003C/code\u003E to \u003Cstrong\u003E/HOL_TIMESERIES_STREAMLIT\u003C/strong\u003E, then click \u003Cstrong\u003EUpload\u003C/strong\u003E.\n\u003Cul\u003E\u003Cli\u003Estreamlit/1_TS_Home.py\u003C/li\u003E\u003Cli\u003Estreamlit/environment.yml\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_home.png\" alt=\"assets/troubleshoot_streamlit_files_home.png\"\u003E\u003C/p\u003E\n\u003Col start=\"7\"\u003E\u003Cli\u003EClick the \u003Ccode\u003E+ Files\u003C/code\u003E button.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png\" alt=\"assets/troubleshoot_streamlit_addfiles.png\"\u003E\u003C/p\u003E\n\u003Col start=\"8\"\u003E\u003Cli\u003EIn the \u003Cstrong\u003EUpload Your Files\u003C/strong\u003E window, \u003Cstrong\u003EDrag and Drop\u003C/strong\u003E the following files from \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E under the \u003Ccode\u003Estreamlit/pages\u003C/code\u003E folder, and set the \u003Ccode\u003ESpecify the path\u003C/code\u003E to \u003Cstrong\u003E/HOL_TIMESERIES_STREAMLIT/pages\u003C/strong\u003E, then click \u003Cstrong\u003EUpload\u003C/strong\u003E.\n\u003Cul\u003E\u003Cli\u003Estreamlit/pages/2_TS_Raw.py\u003C/li\u003E\u003Cli\u003Estreamlit/pages/3_TS_Aggregates.py\u003C/li\u003E\u003Cli\u003Estreamlit/pages/4_TS_Binning.py\u003C/li\u003E\u003Cli\u003Estreamlit/pages/8_TS_About.py\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_pages.png\" alt=\"assets/troubleshoot_streamlit_files_pages.png\"\u003E\u003C/p\u003E\n\u003Col start=\"9\"\u003E\u003Cli\u003EClick the \u003Ccode\u003E+ Files\u003C/code\u003E button.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png\" alt=\"assets/troubleshoot_streamlit_addfiles.png\"\u003E\u003C/p\u003E\n\u003Col start=\"10\"\u003E\u003Cli\u003EIn the \u003Cstrong\u003EUpload Your Files\u003C/strong\u003E window, \u003Cstrong\u003EDrag and Drop\u003C/strong\u003E the following files from \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E under the \u003Ccode\u003Estreamlit/common\u003C/code\u003E folder, and set the \u003Ccode\u003ESpecify the path\u003C/code\u003E to \u003Cstrong\u003E/HOL_TIMESERIES_STREAMLIT/streamlit/common\u003C/strong\u003E, then click \u003Cstrong\u003EUpload\u003C/strong\u003E.\n\u003Cul\u003E\u003Cli\u003Estreamlit/common/snowflake.png\u003C/li\u003E\u003Cli\u003Estreamlit/common/snowflakelogo.png\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_common.png\" alt=\"assets/troubleshoot_streamlit_files_common.png\"\u003E\u003C/p\u003E\n\u003Col start=\"11\"\u003E\u003Cli\u003EUnder the Snowflake logo at the top left, select \u003Ccode\u003E+ Create &gt; SQL Worksheet\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_worksheet.png\" alt=\"assets/troubleshoot_streamlit_files_worksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"12\"\u003E\u003Cli\u003E\u003Cstrong\u003ERun\u003C/strong\u003E the following SQL to create the Streamlit Application.\u003C/li\u003E\u003C/ol\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Create Stramlit Application\nCREATE OR REPLACE STREAMLIT HOL_TIMESERIES_STREAMLIT\nROOT_LOCATION = '@HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT/HOL_TIMESERIES_STREAMLIT'\nMAIN_FILE = '/1_TS_Home.py'\nQUERY_WAREHOUSE = HOL_ANALYTICS_WH;\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"13\"\u003E\u003Cli\u003E\u003Cstrong\u003ELaunch the Streamlit\u003C/strong\u003E application from \u003Ccode\u003EProjects &gt; Streamlit &gt; HOL_TIMESERIES_STREAMLIT\u003C/code\u003E.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_launch.png\" alt=\"assets/troubleshoot_streamlit_launch.png\"\u003E\u003C/p\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003ECleanup\u003C/h2\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EIn \u003Cstrong\u003EVS Code\u003C/strong\u003E open the worksheet \u003Ccode\u003Eworksheets/hol_timeseries_8_cleanup.sql\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EClick the \u003Ccode\u003EExecute All Statements\u003C/code\u003E button at the top right of the worksheet to \u003Cstrong\u003Erun the cleanup script\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/cleanup_script_runall.png\" alt=\"assets/cleanup_script_runall.png\"\u003E\u003C/p\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-sql\"\u003E/*##### CLEANUP SCRIPT #####*/\n\n-- Set role and context\nUSE ROLE ACCOUNTADMIN;\nUSE DATABASE SNOWFLAKE;\n\n-- Cleanup Snowflake objects\nDROP DATABASE HOL_TIMESERIES;\nDROP WAREHOUSE HOL_TRANSFORM_WH;\nDROP WAREHOUSE HOL_ANALYTICS_WH;\nDROP ROLE ROLE_HOL_TIMESERIES;\nDROP USER USER_HOL_TIMESERIES;\n\n/*##### CLEANUP SCRIPT #####*/\n\u003C/code\u003E\u003C/pre\u003E\n\u003Col start=\"2\"\u003E\u003Cli\u003EStop or delete the \u003Ca href=\"https://github.com/codespaces\"\u003EGithub Codespace\u003C/a\u003E, using the Codespace actions menu.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/cleanup_codespace.png\" alt=\"assets/cleanup_codespace.png\"\u003E\u003C/p\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ETroubleshooting\u003C/h3\u003E\n","\u003Cp\u003EThis section runs through a \u003Cstrong\u003ESQL Worksheet\u003C/strong\u003E, this can be run in Snowflake with a \u003Cstrong\u003ESnowsight Worksheet\u003C/strong\u003E. Use the following steps to \u003Cstrong\u003ETroubleshoot\u003C/strong\u003E.\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EInside the \u003Ccode\u003ELab Downloaded Files\u003C/code\u003E folder open \u003Ccode\u003Eworksheets/hol_timeseries_8_cleanup.sql\u003C/code\u003E and \u003Cstrong\u003Ecopy\u003C/strong\u003E the contents of the file.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELogin to Snowflake\u003C/strong\u003E, and from the menu expand \u003Ccode\u003EProjects &gt; Worksheets\u003C/code\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png\" alt=\"assets/analysis_worksheets.png\"\u003E\u003C/p\u003E\n\u003Col start=\"3\"\u003E\u003Cli\u003EAt the top right of the \u003Cstrong\u003EWorksheets\u003C/strong\u003E screen, select \u003Ccode\u003E+ &gt; SQL Worksheet\u003C/code\u003E. This will open a new worksheet in Snowsight.\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003E\u003Cimg src=\"https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png\" alt=\"assets/analysis_newworksheet.png\"\u003E\u003C/p\u003E\n\u003Col start=\"4\"\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPaste\u003C/strong\u003E the copied content into the newly created \u003Cstrong\u003EWorksheet in Snowsight\u003C/strong\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERun\u003C/strong\u003E all the commands in the worksheet.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n\u003C/blockquote\u003E\n&lt;!-- ------------------------ --&gt;\n","\u003Ch2\u003EConclusion and Resources\u003C/h2\u003E\n\u003Cblockquote\u003E\n","\u003Ch3\u003ECongratulations!\u003C/h3\u003E\n","\u003Cp\u003EYou've successfully deployed an end-to-end \u003Cstrong\u003ETime Series Analytics\u003C/strong\u003E solution with streaming data in Snowflake.\u003C/p\u003E\n","\u003Ch4\u003EWe would greatly appreciate your feedback in our \u003Ca href=\"https://docs.google.com/forms/d/e/1FAIpQLSft8rz7OslJoZ4JZIUWMcNjdD45FwKZH5BGNRGY1n5kNIu1dg/viewform\"\u003ETime series analytics survey\u003C/a\u003E\u003C/h4\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003EWhat You Learned\u003C/h3\u003E\n\u003Cul\u003E\u003Cli\u003EHow to \u003Cstrong\u003Estream time series data\u003C/strong\u003E into Snowflake using Snowpipe Streaming\u003C/li\u003E\u003Cli\u003EHow to \u003Cstrong\u003Euse Dynamic Tables\u003C/strong\u003E for continuous data pipeline transformations\u003C/li\u003E\u003Cli\u003EHow to \u003Cstrong\u003Eanalyze time series data\u003C/strong\u003E using native Snowflake time series functions\u003C/li\u003E\u003Cli\u003EHow to \u003Cstrong\u003Ecreate custom time series functions\u003C/strong\u003E and procedure in Snowflake\u003C/li\u003E\u003Cli\u003EHow to \u003Cstrong\u003Edeploy a Streamlit application using Snowflake CLI\u003C/strong\u003E to enable end users to run time series analytics\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EAdditional Resources\u003C/h3\u003E\n","\u003Ch4\u003ESnowflake Documentation\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/querying-time-series-data\"\u003EAnalyzing time-series data\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting\"\u003ETime-Series Forecasting (Snowflake Cortex ML Functions)\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/snowpark/python/index\"\u003ESnowpark Developer Guide for Python\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit\"\u003EStreamlit in Snowflake\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview\"\u003ESnowpipe Streaming\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/kafka-connector-overview\"\u003EOverview of the Kafka connector\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"https://docs.snowflake.com/user-guide/data-load-snowpipe-streaming-kafka\"\u003EUsing Snowflake Connector for Kafka with Snowpipe Streaming\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ESnowflake Blog\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"/blog/time-series-analytics-asof-join-generally-available/\"\u003EAccelerate Your Time Series Analytics with Snowflake&rsquo;s ASOF JOIN, Now Generally Available\u003C/a\u003E\u003C/li\u003E\u003Cli\u003E\u003Ca href=\"/blog/\"\u003ESnowflake Blog\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ESnowflake Community\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://community.snowflake.com/\"\u003EJoin the Snowflake Community\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ESnowflake Training and Certification\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"https://learn.snowflake.com/\"\u003ETraining Courses and Certifications\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E"],"description":"Getting Started with Time Series Analytics for IoT in Snowflake","title":"Getting Started with Time Series Analytics for IoT in Snowflake","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment",":items":{},":itemsOrder":[],"elements":{"quickstartArticleBody":{"dataType":"string","title":"Quickstart Article Body","value":"\u003C!-- ------------------------ --\u003E\n## Overview\n\nSnowflake offers a rich set of functionalities for **Time Series Analytics** making it a performant and cost effective platform for bringing in your time series workloads. This quickstart lab covers a real world scenario of ingesting, analyzing and visualizing IOT time series data.\n\n\n### What You'll Learn\n\nUpon completing this quickstart lab, you will have learned how to perform time series analytics in Snowflake, and will have gained practical experience in several areas:\n\n- **Setup a streaming ingestion** client to to stream time series data into Snowflake using Snowpipe Streaming\n- **Model and transform** the streaming time series data using Dynamic Tables\n- **Analyzing the data** using native time series functions\n- **Building your own time series functions** using Snowpark UDFs when necessary\n- **Deploying a Streamlit application** for visualizing and analyzing time series data\n\n![assets/overview_architecture.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/overview_architecture.png)\n\n\n### What You'll Build\n\nBy the end of this lab you will have an **end-to-end streaming Time Series Analysis solution**, with a front-end application deployed using **Streamlit in Snowflake**.\n\n![assets/streamlit_video_summary.gif](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_summary.gif)\n\n\n### What You'll Need\n\n- A supported Snowflake [Browser](https://docs.snowflake.com/en/user-guide/setup#browser-requirements)\n- [Sign-up for a Snowflake Trial](https://signup.snowflake.com/?utm_source=snowflake-devrel&utm_medium=developer-guides&lab=getting_started_with_time_series_using_snowflake_streaming_sis_ml_notebooks&utm_cta=developer-guides) OR have access to an existing Snowflake account with the ACCOUNTADMIN role. Select the Enterprise edition, AWS as a cloud provider.\n- Access to a **personal [GitHub](https://github.com/signup) account** to fork the quickstart repo and create [GitHub Codespaces](https://docs.github.com/en/codespaces/overview). Codespaces offer a hosted development environment. GitHub offers [free Codespace hours each month](https://github.com/features/codespaces) when using a 2 or 4 node environment, which should be enough to work through this lab.\n\n\u003E \n\u003E \n\u003E It is recommended to use a personal GitHub account which will have permissions to deploy a GitHub Codespace.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Lab Setup\n\n### Step 1 - Fork the Lab GitHub Repository\n\nThe first step is to create a fork of the Lab GitHub repository.\n\n1. In a web browser log into your [Github](https://github.com/) account.\n\n2. Open [Getting Started with Time Series Analytics for IoT in Snowflake associated GitHub Repository](https://github.com/Snowflake-Labs/sfguide-getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks). \n    - This repository contains all the code you need to successfully complete this quickstart guide.\n\n3. Click on the **\"Fork\"** button near the top right.\n\n![assets/labsetup_fork.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_fork.png)\n\n4. Click **\"Create Fork\"**.\n\n![assets/labsetup_createfork.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_createfork.png)\n\n\n### Step 2 - Deploy a GitHub Codespace for the Lab\n\nNow create the GitHub Codespace.\n\n1. Click on the green `\u003C\u003E Code` button from the GitHub repository homepage. \n\n2. In the Code popup, click on the `Codespaces` tab.\n\n3. Click `Create codespace on main`.\n\n![assets/labsetup_createcodespace.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_createcodespace.png)\n\n\u003E \n\u003E\n\u003E If you are seeing the message **Codespace access limited**, you may be logged into Github with an organization account. Please [Sign up to GitHub](https://github.com/signup) using a personal account and retry the **Lab Setup**.\n\u003E\n\n![assets/labsetup_codespace_limited.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_codespace_limited.png)\n\n\u003E \n\u003E \n\u003E This will open a new browser window and begin **Setting up your codespace**. The Github Codespace deployment will take several minutes to set up the entire environment for this lab.\n\u003E\n\n![assets/labsetup_setupcodespace.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_setupcodespace.png)\n\n\u003E \n\u003E\n\u003E **Please wait** for the **postCreateCommand** to run. It may take 5-10 mins to fully deploy.\n\u003E\n\u003E **Ignore any notifications** that may prompt to refresh the Codespace, these will disappear once the postCreateCommand has run.\n\u003E\n\n![assets/labsetup_postcreate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_postcreate.png)\n\n\n#### INFO: Github Codespace Deployment Summary\n\nOnce complete you should see a hosted web-based version of **VS Code Integrated Development Environment (IDE)** in your browser with your forked repository.\n\n![assets/labsetup_vscode.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscode.png)\n\n**The Github Codespace deployment will contain all the resources needed to complete the lab**.\n\n\u003E \n\u003E\n\u003E If you do not see the **Snowflake VS Code Extension** try **Refreshing** your browser window.\n\u003E\n\n### Step 3 - Verify Your Anaconda Environment is Activated\n\nDuring the Codespace setup the postCreateCommand script created an Anaconda virtual environment named **hol-timeseries**. This virtual environment contains the packages needed to connect and interact with Snowflake using the **Snowflake CLI**.\n\nTo activate the virtual environment:\n\n1. Remove any existing open Terminal by clicking the `Kill Terminal` button\n\n![assets/labsetup_killterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_killterminal.png)\n\n2. Open `Menu \u003E Terminal \u003E New Terminal` - a new terminal window will now open\n\n![assets/labsetup_newterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png)\n\n3. Enter command `conda activate hol-timeseries`\n\n![assets/labsetup_condaactivate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png)\n\n![assets/labsetup_condaactivated.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png)\n\nThe terminal prompt should now show a prefix `(hol-timeseries)` to confirm the **hol-timeseries** virtual environment is activated.\n\n\n### Step 4 - Update Snowflake Connection Account Identifiers in Lab Files\n\n1. Login to your Snowflake account using a browser \n\n2. From the menu expand `Projects \u003E Worksheets`\n\n![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\n3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\n![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\n4. **In the new worksheet**, execute the following command that uses [SYSTEM$ALLOWLIST](https://docs.snowflake.com/en/sql-reference/functions/system_allowlist) to find your **ACCOUNT_IDENTIFIER**:\n\n```sql\nSELECT REPLACE(AL.VALUE:host::VARCHAR, '.snowflakecomputing.com', '') AS ACCOUNT_IDENTIFIER\nFROM TABLE(FLATTEN(input =\u003E PARSE_JSON(SYSTEM$ALLOWLIST()))) AS AL\nWHERE AL.VALUE:type::VARCHAR = 'SNOWFLAKE_DEPLOYMENT_REGIONLESS';\n```\n\n5. In the results returned, below the command, select the row returned, and **Copy** the **ACCOUNT_IDENTIFIER**.\n\n![assets/labsetup_regionless.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_regionless.png)\n\n6. Back in **VS Code**, navigate to the following files and in the files replace **\u003CACCOUNT_IDENTIFIER\u003E** with your Snowflake account identifier value:\n\n* `.snowflake/config.toml`\n    - **account** variable for **both** connections\n\n![assets/labsetup_files_snowflakeconfig.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_files_snowflakeconfig.png)\n \n* `iotstream/snowflake.properties`\n    - **account** variable\n    - **host** variable\n\n![assets/labsetup_files_iotstreamproperties.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_files_iotstreamproperties.png)\n\n7. **Save** file changes by pressing `Command/Ctrl` and `S`\n\n\n### Step 5 - Configure Snowflake VS Code Extension Connection\n\n1. Open the **Snowflake VS Code Extension**\n\n![assets/labsetup_vscodeextension.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension.png)\n\n2. For **Account Identifier/URL**, enter your **\u003CACCOUNT_IDENTIFIER\u003E**, **without** the `.snowflakecomputing.com`\n3. Click **Continue**\n\n![assets/labsetup_snowextension.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowextension.png)\n\n1. For Auth Method select `Username/password`\n2. For Username enter the **ACCOUNTADMIN user** (defined when setting up the Snowflake account)\n3. For Password enter the **ACCOUNTADMIN password**\n3. Click `Sign in`\n\n![assets/labsetup_snowsignin.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowsignin.png)\n\n\u003E \n\u003E\n\u003E **The VS Code Snowflake Extension** should now be connected to your Snowflake. **Once connected**, it will show a `Sign Out` button along with **Databases** and **Applications** in the `OBJECT EXPLORER` section.\n\n![assets/labsetup_snowconnected.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_snowconnected.png)\n\n\n### Step 6 - Expand Snowflake Worksheets Folder\n\n**Worksheets** have been provided for the next sections, these can be accessed by going to **VS Code Explorer** and expanding the `worksheets` folder.\n\n![assets/labsetup_worksheet1.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_worksheet1.png)\n\n\u003E \n\u003E\n\u003E We'll need to update the **setup worksheet** with your **PUBLIC KEY** to be used during the initial Snowflake setup.\n\n\n### Step 7 - Retrieve the Snowflake Public Key\nAs part of the GitHub Codespace setup, an **OpenSSL Private Key-pair** will be generated in the **VS Code** `keys` directory.\n\n**Copy** the **PUBLIC KEY** value from the `keys/rsa_key.pub` file. This will be needed in the setup worksheet.\n\n\u003E \n\u003E\n\u003E Only the **PUBLIC KEY** value is required, which is the section **between**\n\u003E\n\u003E `-----BEGIN PUBLIC KEY-----` and `-----END PUBLIC KEY-----`\n\u003E\n\u003E ensure you **DO NOT** copy these lines.\n\n![assets/labsetup_publickey.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_publickey.png)\n\n\u003E \n\u003E \n\u003E The **GitHub Codespace** may prompt to access the clipboard in **VSCode**, select **Allow** if prompted.\n\u003E\n\n![assets/streamlit_codespace_paste.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_codespace_paste.png)\n\n\n### Step 8 - Update Snowflake \"Setup\" Worksheet with Lab Provisioned PUBLIC KEY\n1. Open worksheet: `worksheets/hol_timeseries_1_setup.sql`\n\n2. **Find and replace** the **\u003CRSA_PUBLIC_KEY\u003E** with the **PUBLIC KEY** copied from the `keys/rsa_key.pub` file.\n\n![assets/labsetup_rsakey.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_rsakey.png)\n\n**NOTE:** The pasted **PUBLIC KEY** can show on multiple lines and will work.\n\n\n\u003E \n\u003E \n\u003E **NO NEED TO RUN** anything just yet, this is just setup, this worksheet will be run in the next section.\n\u003E\n\u003E The **Snowflake setup** is complete, and The Lab environment is configured!\n\n\u003E \n\u003E \n\u003E ### Lab Troubleshooting\n\u003E\n\u003E **Under some sections of the lab, Troubleshooting steps have been provided to assist with any issues that may occur**.\n\u003E\n\u003E In the event that you experience issues in a particular section, refer to the **Troubleshooting** steps where provided.\n\u003E\n\u003E Please use the following steps to **download the lab files locally** for reference, and in case of the GitHub Codespace not deploying.\n\u003E\n\u003E #### Download and Extract Lab Files\n\u003E \n\u003E 1. **Download** Lab Files: \u003Cbutton\u003E[Getting Started with Time Series Analytics for IoT in Snowflake](https://github.com/Snowflake-Labs/sfguide-getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/archive/refs/heads/main.zip)\u003C/button\u003E\n\u003E\n\u003E 2. Extract the **lab downloaded files** to an accessible location on your computer.\n\u003E\n\u003E 3. The lab will refer to the extracted **lab downloaded files** as `Lab Downloaded Files`.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Setup Snowflake Resources\n\n#### Create the Foundational Snowflake Objects for this Lab\n\nThis includes:\n- Role: **ROLE_HOL_TIMESERIES** - role used for working throughout the lab\n- User: **USER_HOL_TIMESERIES** - the user to connect to Snowflake\n- Warehouses:\n    - **HOL_TRANSFORM_WH** - warehouse used for transforming ingested data\n    - **HOL_ANALYTICS_WH** - warehouse used for analytics\n- Database: **HOL_TIMESERIES** - main database to store all lab objects\n- Schemas:\n    - **STAGING** - RAW data source landing schema\n    - **TRANSFORM** - transformed and modeled data schema\n    - **ANALYTICS** - serving and analytics functions schema\n- Grants: Access control grants for role **ROLE_HOL_TIMESERIES**\n\n![assets/snowsetup_architecture.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowsetup_architecture.png)\n\n\n### Step 1 - Run Snowflake Setup Worksheet\n\nIn the **GitHub Codespace VS Code** open worksheet: `worksheets/hol_timeseries_1_setup.sql`\n\n\u003E \n\u003E \n\u003E #### INFO: Snowflake VS Code Extension\n\u003E\n\u003E The **Snowflake VS Code Extension** will detect **executable statement** lines within a worksheet. You can choose to run all or specific statements.\n\u003E\n\u003E - **Execute All Statements**: To run the worksheet in full, select the `Execute All Statements` button at the top right of the worksheet.\n\u003E\n\u003E ![assets/labsetup_vscodeextension_runall.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runall.png)\n\u003E\n\u003E - **Multiple Statements**: Highlighting / selecting the statements you want to run, and pressing **Command/Ctrl** and **Enter**.\n\u003E\n\u003E ![assets/labsetup_vscodeextension_runmulti.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runmulti.png)\n\u003E\n\u003E - **Individual Statements**: Click the `Execute` link above each statement line.\n\u003E \n\u003E ![assets/snowsetup_vscode_execute.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowsetup_vscode_execute.png)\n\u003E\n\u003E **Executed statements** will show in the **QUERY HISTORY** tab of the Snowflake VS Code Extension.\n\u003E\n\u003E ![assets/labsetup_vscodeextension_queryhistory.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_queryhistory.png)\n\u003E\n\n#### Run the Worksheet to get Snowflake Resources Created\n\n**As the worksheet has been set up during the \"Lab Setup\" section, click** `Execute All Statements`.\n\n![assets/labsetup_vscodeextension_runall.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_vscodeextension_runall.png)\n\n\u003E \n\u003E \n\u003E This section will run using the **ACCOUNTADMIN** role and login setup via **Snowflake VS Code Extension** connection.\n\u003E \n\u003E There is an **EXTERNAL ACTIVITY** section in the worksheet, which was already done as part of **\"Lab Setup\"**.\n\u003E\n\n```sql\n/*##### SNOWFLAKE SETUP SCRIPT #####*/\n\n-- Login and assume ACCOUNTADMIN role\nUSE ROLE ACCOUNTADMIN;\n\n-- Create lab role\nCREATE ROLE IF NOT EXISTS ROLE_HOL_TIMESERIES;\nGRANT ROLE ROLE_HOL_TIMESERIES TO ROLE SYSADMIN;\n\n-- Create lab user\nCREATE OR REPLACE USER USER_HOL_TIMESERIES DEFAULT_ROLE = \"ROLE_HOL_TIMESERIES\"\nCOMMENT = \"HOL Time Series user.\";\nGRANT ROLE ROLE_HOL_TIMESERIES TO USER USER_HOL_TIMESERIES;\n\n/*###### EXTERNAL ACTIVITY #####\nA public key is setup in Github Codespace VS Code environment: keys/rsa_key.pub\n\nRetrieve the public key detail and replace \u003CRSA_PUBLIC_KEY\u003E\nwith the contents of the public key excluding\nthe -----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY----- lines\n##############################*/\n\n-- Assign lab user public key\nALTER USER USER_HOL_TIMESERIES SET RSA_PUBLIC_KEY='\u003CRSA_PUBLIC_KEY\u003E';\n\n-- Setup HOL infrastructure objects\n-- Assume the SYSADMIN role\nUSE ROLE SYSADMIN;\n\n-- Create a TRANSFORM WH - used for ingest and transform activity\nCREATE WAREHOUSE IF NOT EXISTS HOL_TRANSFORM_WH WITH WAREHOUSE_SIZE = XSMALL\nAUTO_SUSPEND = 60 AUTO_RESUME = TRUE INITIALLY_SUSPENDED = TRUE\nCOMMENT = 'Transform Warehouse' ENABLE_QUERY_ACCELERATION = TRUE;\n\n-- Create an Analytics WH = used for analytics and reporting\nCREATE WAREHOUSE IF NOT EXISTS HOL_ANALYTICS_WH WITH WAREHOUSE_SIZE = XSMALL\nAUTO_SUSPEND = 60 AUTO_RESUME = TRUE INITIALLY_SUSPENDED = TRUE\nCOMMENT = 'Analytics Warehouse' ENABLE_QUERY_ACCELERATION = TRUE;\n\n\n-- Create HOL Database\nCREATE DATABASE IF NOT EXISTS HOL_TIMESERIES COMMENT = 'HOL Time Series database.';\n\n\n-- HOL Schemas\n-- Create STAGING schema - for RAW data\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.STAGING WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series STAGING schema.';\n\n-- Create TRANSFORM schema - for modeled data\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.TRANSFORM WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series TRANSFORM schema.';\n\n-- Create ANALYTICS schema - for serving analytics\nCREATE SCHEMA IF NOT EXISTS HOL_TIMESERIES.ANALYTICS WITH MANAGED ACCESS\nCOMMENT = 'HOL Time Series ANALYTICS schema.';\n\n\n-- Grant HOL role access to lab resources\n-- Assign database grants to lab role\nGRANT USAGE ON DATABASE HOL_TIMESERIES TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Assign Warehouse grants to lab role\nGRANT ALL ON WAREHOUSE HOL_TRANSFORM_WH TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON WAREHOUSE HOL_ANALYTICS_WH TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Assign schema grants to lab role\nGRANT ALL ON SCHEMA HOL_TIMESERIES.STAGING TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON SCHEMA HOL_TIMESERIES.TRANSFORM TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT ALL ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Cortex ML Functions\nGRANT CREATE SNOWFLAKE.ML.ANOMALY_DETECTION ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\nGRANT CREATE SNOWFLAKE.ML.FORECAST ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n-- Notebooks\nGRANT CREATE NOTEBOOK ON SCHEMA HOL_TIMESERIES.ANALYTICS TO ROLE ROLE_HOL_TIMESERIES;\n\n/*##### SNOWFLAKE SETUP SCRIPT #####*/\n```\n\n\u003E \n\u003E \n\u003E The Snowflake foundation objects have now been deployed, and we can continue on to set up a **Snowpipe Streaming Ingestion**.\n\u003E\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E This section runs through a **SQL Worksheet**, this can be run in Snowflake with a **Snowsight Worksheet**. Use the following steps to **Troubleshoot**.\n\u003E\n\u003E\n\u003E 1. Inside the `Lab Downloaded Files` folder open `worksheets/hol_timeseries_1_setup.sql` and **copy** the contents of the file.\n\u003E\n\u003E 2. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`.\n\u003E\n\u003E ![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\u003E\n\u003E 3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\u003E\n\u003E ![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\u003E\n\u003E 4. **Paste** the copied content into the newly created **Worksheet in Snowsight**.\n\u003E\n\u003E 5. **Run** all the commands in the worksheet.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Snowpipe Streaming Ingestion\n\nWith the foundational objects setup, we can now **deploy a staging table** to stream time series data into Snowflake via a Snowpipe Streaming client.\n\nFor this lab a **Java IOT Simulator Client** application has been created to stream IoT sensor readings into Snowflake.\n\n![assets/snowpipe_streamingest.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_streamingest.png)\n\n\n### Step 1 - Create Streaming Staging Table\n\nWe'll create a stage loading table to stream RAW time series data into Snowflake. This will be located in the **STAGING** schema of the **HOL_TIMESERIES** database.\n\n![assets/snowpipe_stagetable.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_stagetable.png)\n\nIn the **GitHub Codespace VS Code** open worksheet: `worksheets/hol_timeseries_2_ingest.sql`\n\n1. Run the **Staging Table** script to create the IoT stream staging table.\n\n```sql\n/*##############################\n-- Staging Table - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.STAGING;\nUSE WAREHOUSE HOL_TRANSFORM_WH;\n\n-- Setup staging tables - RAW_TS_IOTSTREAM_DATA\nCREATE OR REPLACE TABLE HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA (\n    RECORD_METADATA VARIANT,\n    RECORD_CONTENT VARIANT\n)\nCHANGE_TRACKING = TRUE\nCOMMENT = 'IOTSTREAM staging table.'\n;\n\n/*##############################\n-- Staging Table - END\n##############################*/\n```\n\nThe IoT data will be streamed into Snowflake in a similar [schema format as Kafka](https://docs.snowflake.com/en/user-guide/kafka-connector-overview#schema-of-tables-for-kafka-topics) which contains two columns:\n- **RECORD_CONTENT** - This contains the Kafka message.\n- **RECORD_METADATA** - This contains metadata about the message, for example, the topic from which the message was read.\n\n\u003E \n\u003E \n\u003E There are **EXTERNAL ACTIVITY** sections in the worksheet, which will be executed within the **GitHub Codespace** terminal. Details in the next steps.\n\u003E\n\n\n#### INFO: Snowpipe Streaming Ingest Client SDK\n\nSnowflake provides an [Ingest Client SDK](https://mvnrepository.com/artifact/net.snowflake/snowflake-ingest-sdk) in Java that allows applications, such as Kafka Connectors, to stream rows of data into a Snowflake table at low latency.\n\n![assets/data-load-snowpipe-streaming.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/data-load-snowpipe-streaming.png)\n\nThe Ingest Client SDK is configured with a secure JDBC connection to Snowflake, and will establish a streaming [Channel](https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview#channels) between the client and a Snowflake table.\n\n![assets/data-load-snowpipe-streaming-client-channel.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/data-load-snowpipe-streaming-client-channel.png)\n\n\n### Step 2 - Test Streaming Client\n\nNow that a staging table is available to stream time series data. We can look at setting up a streaming connection channel with a Java Snowpipe Streaming client. The simulator Java application is available in the `iotstream` folder of the lab, and can be run via a terminal with a Java runtime.\n\n\u003E \n\u003E \n\u003E The lab environment has been set up with a **Java Runtime** to execute the Java Snowpipe Streaming client application.\n\u003E\n\nIn the **GitHub Codespace VS Code**:\n\n1. Open `Menu \u003E Terminal \u003E New Terminal` - a new terminal window will now open\n\n![assets/labsetup_newterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png)\n\n2. Change directory into to the **iotstream** folder: `cd iotstream`\n\n```bash\ncd iotstream\n```\n\n3. Run the `Test.sh` script to confirm a table channel stream can be established with Snowflake.\n\n```bash\n./Test.sh\n```\n\n\u003E \n\u003E \n\u003E If **successful**, it will return:\n\u003E `** Successfully Connected, Test complete! **`\n\u003E\n\u003E This will confirm that the Java streaming client is able to connect to Snowflake, and is able to establish a channel to the target table.\n\u003E\n\n4. In **VS Code** open the worksheet `worksheets/hol_timeseries_2_ingest.sql` and run the `SHOW CHANNELS` command to confirm a channel is now open to Snowflake.\n\n```sql\nSHOW CHANNELS;\n```\n\nThe query should return a single channel `CHANNEL_1_TEST` opened to the `RAW_TS_IOTSTREAM_DATA` table.\n\n![assets/snowpipe_channeltest.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_channeltest.png)\n\n**With a channel now opened to the table we are ready to stream data into the table.**\n\n\n### Step 3 - Load a Simulated IoT Data Set\n\nWith the channel connection being successful, we can now load the IoT data set, as fast as the connection and machine will allow.\n\n![assets/snowpipe_streamingclient.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_streamingclient.png)\n\nThe simulated **IoT dataset contains six sensor devices** at various frequencies, with each device being assigned a unique Tag Names within a single **namespace** called **\"IOT\"**.\n\n| **Namespace** | **Tag Name** | **Frequency** | **Units** | **Data Type** | **Sensor Type** |\n| --- | --- | --- | --- | --- | --- |\n| IOT | TAG101 | 5 SEC | PSI | DOUBLE | Pressure Gauge |\n| IOT | TAG201 | 10 SEC | RPM | DOUBLE | Motor RPM |\n| IOT | TAG301 | 1 SEC | KPA | DOUBLE | Pressure Gauge |\n| IOT | TAG401 | 60 SEC | CM3S | DOUBLE | Flow Sensor |\n| IOT | TAG501 | 60 SEC | DEGF | DOUBLE | Temperature Gauge |\n| IOT | TAG601 | 10 SEC | KPA | DOUBLE | Pressure Gauge |\n\n1. In the **VS Code** `Terminal` run the `Run_MAX.sh` script to load the IoT data.\n\n```bash\n./Run_MAX.sh\n```\n\n\u003E \n\u003E \n\u003E Depending on the **speed of the machine** running the Java streaming client application, and the **network connectivity**, this may take a minute to load.\n\u003E\n\n\u003E \n\u003E \n\u003E #### INFO: Java Streaming Client Application\n\u003E\n\u003E The **Java streaming client application** is being called using a **Terminal shell script**. The Java application accepts various speed input parameters to change the number of rows that are streamed. The **\"MAX\"** script will send as many rows as the device will allow to the **Snowpipe Streaming API** and into the target table.\n\u003E\n\n2. In **VS Code** open the worksheet `worksheets/hol_timeseries_2_ingest.sql` and run the `SHOW CHANNELS` command to confirm a new channel is now open to Snowflake.\n\n```sql\nSHOW CHANNELS;\n```\n\nThe query should return a new channel `CHANNEL_1_MAX` opened to the `RAW_TS_IOTSTREAM_DATA` table, with an **offset_token** showing the number of rows loaded.\n\n![assets/snowpipe_channelmax.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_channelmax.png)\n\n3. In **VS Code** open the worksheet `worksheets/hol_timeseries_2_ingest.sql` and view the streamed records, by running the `Check stream table data` script.\n\n```sql\n-- Check stream table data\nSELECT * FROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA LIMIT 10;\n```\n\n- **RECORD_METADATA** - This contains metadata about IOT Tag reading.\n\n![assets/snowpipe_record_meta.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_record_meta.png)\n\n- **RECORD_CONTENT** - This contains the IOT Tag reading.\n\n![assets/snowpipe_record_content.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/snowpipe_record_content.png)\n\nEach IoT device reading is a **JSON payload**, transmitted in the following Kafka like format:\n\n```json\n{\n    \"meta\":\n    {\n        \"LogAppendTime\": \"1714487166815\",\n        \"headers\":\n        {\n            \"namespace\": \"IOT\",\n            \"source\": \"STREAM_DATA.csv\",\n            \"speed\": \"MAX\"\n        },\n        \"offset\": \"116\",\n        \"partition\": \"1\",\n        \"topic\": \"time-series\"\n    },\n    \"content\":\n    {\n        \"datatype\": \"double\",\n        \"tagname\": \"SENSOR/TAG301\",\n        \"timestamp\": \"1704067279\",\n        \"units\": \"KPA\",\n        \"value\": \"118.152\"\n    } \n}\n```\n\n\u003E \n\u003E \n\u003E Data has now been **streamed into Snowflake**, and we can now look at modeling the data for analytics.\n\u003E\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E If you encounter issues with getting data loaded via the **Snowpipe Streaming Ingestion** section, use the following steps to **Troubleshoot**.\n\u003E\n\u003E #### Connection Test.sh Script Error: Exception in thread \"main\" java.lang.SecurityException: Authorization failed after retry\n\u003E\n\u003E This error indicates that the **user public key setup** is the likely issue.\n\u003E\n\u003E Refer to the **\"Lab Setup\" section Step 7 and 8**, and then run through the **Setup Snowflake Resources** section again.\n\u003E\n\u003E #### Manually Load the IoT Data\n\u003E\n\u003E 1. Inside the `Lab Downloaded Files` folder open `help/snowflake_manual_ingest.sql` and **copy** the contents of the file.\n\u003E\n\u003E 2. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`.\n\u003E\n\u003E ![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\u003E\n\u003E 3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\u003E\n\u003E ![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\u003E\n\u003E 4. **Paste** the copied content into the newly created **Worksheet in Snowsight**.\n\u003E\n\u003E 5. **Run** all the commands in the worksheet.\n\u003E\n\u003E #### GitHub Codespace is Showing Out of Memory Errors\n\u003E\n\u003E The **GitHub Codespace machine type** can be changed to an instance with more memory.\n\u003E\n\u003E 1. Open [GitHub Codespaces](https://github.com/codespaces). Select `Menu \u003E Change machine type`.\n\u003E\n\u003E ![assets/troubleshoot_ingest_codespace_machine.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machine.png)\n\u003E\n\u003E 2. Select a **machine type with more memory**, and click `Update Codespace`.\n\u003E\n\u003E ![assets/troubleshoot_ingest_codespace_machineupdate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machineupdate.png)\n\u003E\n\u003E 3. If the GitHub Codespace was already running, select `Menu \u003E Stop codespace`\n\u003E\n\u003E ![assets/troubleshoot_ingest_codespace_machinestop.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_ingest_codespace_machinestop.png)\n\u003E\n\u003E 4. Select the Github Codespace to launch it, and **Re-run** the ingestion scripts.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Data Modeling and Transformation\n\nNow that data has been streamed into Snowflake, we are ready for some **Data Engineering** activities to get the data into a report ready state for analytics. We'll be **transforming the data** from the **JSON VARIANT** format into a tabular format. Using Snowflake **Dynamic Tables**, the data streamed into Snowflake will continuously update the analytics layers.\n\nAlong with setting up Dynamic Tables for continuous loading, we'll also deploy some **analytics views** for the consumer serving layer. This will allow for specific columns of data to be exposed to the end users and applications.\n\n![assets/model_dataengineering.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dataengineering.png)\n\n\n#### INFO: Dynamic Tables\n\n[Dynamic Tables](https://docs.snowflake.com/en/user-guide/dynamic-tables-intro) are a declarative way of defining your data pipeline in Snowflake. It's a Snowflake table which is **defined as a query to continuously and automatically materialize the result of that query as a table**. Dynamic Tables can join and aggregate across **multiple source objects** and **incrementally update** results as sources change.\n\nDynamic Tables can also be chained together to create a DAG for more complex data pipelines.\n\n![assets/dynamic_tables.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/dynamic_tables.png)\n\n\n### Step 1 - Model Time Series Data with Dynamic Tables\n\nFor the IoT streaming data we'll setup two Dynamic Tables in a simple Dimension and Fact model:\n- **DT_TS_TAG_METADATA (Dimension)**: Containing Tag Metadata such as tag names, sourcing, and data types\n- **DT_TS_TAG_READINGS (Fact)**: Containing the readings from each IoT sensor in raw and numeric format\n\n![assets/model_dynamictables.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables.png)\n\nIn **VS Code** open the worksheet `worksheets/hol_timeseries_3_transform.sql` and run the **Dynamic Tables Setup** scripts.\n\n```sql\n/*##############################\n-- Dynamic Tables Setup - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.TRANSFORM;\nUSE WAREHOUSE HOL_TRANSFORM_WH;\n\n/* Tag metadata (Dimension)\nTAGNAME - uppercase concatenation of namespace and tag name\nQUALIFY - deduplication filter to only include unique tag names\n*/\nCREATE OR REPLACE DYNAMIC TABLE HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_METADATA\nTARGET_LAG = '1 MINUTE'\nWAREHOUSE = HOL_TRANSFORM_WH\nREFRESH_MODE = 'INCREMENTAL'\nAS\nSELECT\n    SRC.RECORD_METADATA:headers:namespace::VARCHAR AS NAMESPACE,\n    SRC.RECORD_METADATA:headers:source::VARCHAR AS TAGSOURCE,\n    UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) AS TAGNAME,\n    SRC.RECORD_CONTENT:units::VARCHAR AS TAGUNITS,\n    SRC.RECORD_CONTENT:datatype::VARCHAR AS TAGDATATYPE\nFROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA SRC\nQUALIFY ROW_NUMBER() OVER (PARTITION BY UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) ORDER BY SRC.RECORD_CONTENT:timestamp::NUMBER, SRC.RECORD_METADATA:offset::NUMBER) = 1;\n\n/* Tag readings (Fact)\nTAGNAME - uppercase concatenation of namespace and tag name\nQUALIFY - deduplication filter to only include unique tag readings based on tagname and timestamp\n*/\nCREATE OR REPLACE DYNAMIC TABLE HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_READINGS\nTARGET_LAG = '1 MINUTE'\nWAREHOUSE = HOL_TRANSFORM_WH\nREFRESH_MODE = 'INCREMENTAL'\nAS\nSELECT\n    UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))) AS TAGNAME,\n    SRC.RECORD_CONTENT:timestamp::VARCHAR::TIMESTAMP_NTZ AS TIMESTAMP,\n    SRC.RECORD_CONTENT:value::VARCHAR AS VALUE,\n    TRY_CAST(SRC.RECORD_CONTENT:value::VARCHAR AS FLOAT) AS VALUE_NUMERIC,\n    SRC.RECORD_METADATA:partition::VARCHAR AS PARTITION,\n    SRC.RECORD_METADATA:offset::VARCHAR AS OFFSET\nFROM HOL_TIMESERIES.STAGING.RAW_TS_IOTSTREAM_DATA SRC\nQUALIFY ROW_NUMBER() OVER (PARTITION BY UPPER(CONCAT('/', SRC.RECORD_METADATA:headers:namespace::VARCHAR, '/', TRIM(SRC.RECORD_CONTENT:tagname::VARCHAR))), SRC.RECORD_CONTENT:timestamp::NUMBER ORDER BY SRC.RECORD_METADATA:offset::NUMBER) = 1;\n\n/*##############################\n-- Dynamic Tables Setup - END\n##############################*/\n```\n\n\u003E \n\u003E \n\u003E #### INFO: Dynamic Table TARGET_LAG Parameter\n\u003E\n\u003E **Dynamic Tables** have a [TARGET_LAG](https://docs.snowflake.com/en/user-guide/dynamic-tables-refresh#label-dynamic-tables-understand-dt-lag) parameter, which defines a **target “freshness”** for the  data. In this case, we have configured the Dynamic Tables to have a TARGET_LAG of 1 minute, so we want the Dynamic Table to **update within 1 minute of the base tables being updated**.\n\u003E\n\n\n### Step 2 - Review Dynamic Table Details\n\n1. **Login to Snowflake**, and from the menu expand `Data \u003E Databases \u003E HOL_TIMESERIES \u003E TRANSFORM \u003E Dynamic Tables \u003E DT_TS_TAG_METADATA \u003E Refresh History`\n\n**The DT_TS_TAG_METADATA table will show six rows loaded, representing the six tags of data streamed into Snowflake**.\n\n![assets/model_dynamictables_metadata.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_metadata.png)\n\n2. Open the `Data Preview` tab\n\n**You can now see the Tag Metadata in a columnar table format**.\n\n![assets/model_dynamictables_metadata_preview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_metadata_preview.png)\n\n3. Select `Dynamic Tables \u003E DT_TS_TAG_READINGS \u003E Refresh History`\n\n**The DT_TS_TAG_READINGS table will show all the tag readings streamed into Snowflake**.\n\n![assets/model_dynamictables_readings.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_readings.png)\n\n4. Open the `Data Preview` tab\n\n**You can now see the Tag Readings in a columnar table format**.\n\n![assets/model_dynamictables_readings_preview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_dynamictables_readings_preview.png)\n\n\u003E \n\u003E \n\u003E Data is now being **transformed in Snowflake** using **Dynamic Tables**.\n\u003E\n\n### Step 3 - Create Analytics Views for Consumers\n\nThe Dynamic Tables are now set up to continuously transform streaming data. We can now look at setting up a **Curated Analytics** serving layer with some views for end users and applications to consume the streaming data.\n\n![assets/model_analyticviews.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_analyticviews.png)\n\nWe'll create a set of analytics views similar to the Dynamic Tables with a subset of columns in the **ANALYTICS** schema:\n- **TS_TAG_REFERENCE (Dimension)**: Containing Tag Metadata such as tag names, sourcing, and data types\n- **TS_TAG_READINGS (Fact)**: Containing the readings from each IoT sensor in raw and numeric format\n\nIn **VS Code** open the worksheet `worksheets/hol_timeseries_3_transform.sql` and run the **Analytics Views Setup** scripts.\n\n```sql\n/*##############################\n-- Analytics Views Setup - START\n##############################*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Tag Reference View\nCREATE OR REPLACE VIEW HOL_TIMESERIES.ANALYTICS.TS_TAG_REFERENCE AS\nSELECT\n    META.NAMESPACE,\n    META.TAGSOURCE,\n    META.TAGNAME,\n    META.TAGUNITS,\n    META.TAGDATATYPE\nFROM HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_METADATA META;\n\n-- Tag Readings View\nCREATE OR REPLACE VIEW HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS AS\nSELECT\n    READ.TAGNAME,\n    READ.TIMESTAMP,\n    READ.VALUE,\n    READ.VALUE_NUMERIC\nFROM HOL_TIMESERIES.TRANSFORM.DT_TS_TAG_READINGS READ;\n\n/*##############################\n-- Analytics Views Setup - END\n##############################*/\n```\n\n\u003E \n\u003E \n\u003E Data is now **modeled in Snowflake** and available in the **ANALYTICS** schema, and we can now proceed to analyze the data using Snowflake time series functions.\n\u003E\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E This section runs through a **SQL Worksheet**, this can be run in Snowflake with a **Snowsight Worksheet**. Use the following steps to **Troubleshoot**.\n\u003E\n\u003E\n\u003E1. Inside the `Lab Downloaded Files` folder open `worksheets/hol_timeseries_3_transform.sql` and **copy** the contents of the file.\n\u003E\n\u003E 2. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`.\n\u003E\n\u003E ![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\u003E\n\u003E 3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\u003E\n\u003E ![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\u003E\n\u003E 4. **Paste** the copied content into the newly created **Worksheet in Snowsight**.\n\u003E\n\u003E 5. **Run** all the commands in the worksheet.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Time Series Analysis\n\nNow that we have created the analytics views, we can start to query the data using **Snowflake native time series functions**.\n\n![assets/analysis_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_overview.png)\n\n\n#### INFO: Time Series Query Profiles\n\nThe following query profiles will be covered in this section.\n\n| **Query Type** | **Functions** | **Description** |\n| --- | --- | --- |\n| Raw | Time Boundary: Left, Right, and Both | Raw data within a time range. |\n| Math [Statistical Aggregates](https://docs.snowflake.com/en/sql-reference/functions-aggregation) | [MIN](https://docs.snowflake.com/en/sql-reference/functions/min), [MAX](https://docs.snowflake.com/en/sql-reference/functions/max), [AVG](https://docs.snowflake.com/en/sql-reference/functions/avg), [COUNT](https://docs.snowflake.com/en/sql-reference/functions/count), [SUM](https://docs.snowflake.com/en/sql-reference/functions/sum), FREQUENCY | Mathematical calculations over values within a time range. |\n| Distribution [Statistical Aggregates](https://docs.snowflake.com/en/sql-reference/functions-aggregation) | [APPROX_PERCENTILE](https://docs.snowflake.com/en/sql-reference/functions/approx_percentile), [STDDEV](https://docs.snowflake.com/en/sql-reference/functions/stddev), [VARIANCE](https://docs.snowflake.com/en/sql-reference/functions/variance), [KURTOSIS](https://docs.snowflake.com/en/sql-reference/functions/kurtosis), [SKEW](https://docs.snowflake.com/en/sql-reference/functions/skew) | Statistics on distributions of data. |\n| [Window Functions](https://docs.snowflake.com/en/sql-reference/functions-analytic) | [LAG](https://docs.snowflake.com/en/sql-reference/functions/lag), [LEAD](https://docs.snowflake.com/en/sql-reference/functions/lead), [FIRST_VALUE](https://docs.snowflake.com/en/sql-reference/functions/first_value), [LAST_VALUE](https://docs.snowflake.com/en/sql-reference/functions/last_value), ROWS BETWEEN, RANGE BETWEEN | Functions over a group of related rows. |\n| Watermarks | [MAX_BY](https://docs.snowflake.com/en/sql-reference/functions/max_by), [MIN_BY](https://docs.snowflake.com/en/sql-reference/functions/min_by) | Find latest or earliest values ordered by timestamps. |\n| Downsampling / Time Binning | [TIME_SLICE](https://docs.snowflake.com/en/sql-reference/functions/time_slice) | Time binning aggregations over time intervals. |\n| Aligning time series datasets | [ASOF JOIN](https://docs.snowflake.com/en/sql-reference/constructs/asof-join) | Joining time series datasets when the timestamps don't match exactly, and interpolating values. |\n| Gap Filling | [GENERATOR](https://docs.snowflake.com/en/sql-reference/functions/generator), [ROW_NUMBER](https://docs.snowflake.com/en/sql-reference/functions/row_number), [SEQ](https://docs.snowflake.com/en/sql-reference/functions/seq1) | Generating timestamps to fill time gaps. |\n| Forecasting | [Time-Series Forecasting (Snowflake Cortex ML Functions)](https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting), [FORECAST](https://docs.snowflake.com/en/sql-reference/classes/forecast/commands/create-forecast)  | Generating Time Series Forecasts using Snowflake Cortex ML. |\n| Date & Time Functions | [Date & Time Functions](https://docs.snowflake.com/en/sql-reference/functions-date-time) | This family of functions can be used to construct, convert, extract, or modify DATE/TIME/TIMESTAMP data. |\n\n\n### Step 1 - Copy Worksheet Content To Snowsight Worksheet\n\n#### This section will be executed within a Snowflake Snowsight Worksheet\n\n1. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`\n\n![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\n2. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\n![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\n3. In **VS Code** open the worksheet `worksheets/hol_timeseries_4_anaysis.sql`\n\n4. **Copy** the contents of the worksheet to **clipboard**, and paste it into the newly created **Worksheet in Snowsight**\n\n\u003E \n\u003E \n\u003E #### INFO: Snowsight Worksheet Query Statement Execution\n\u003E\n\u003E In the following sections you will run various query statements within a **Snowsight Worksheet**.\n\u003E\n\u003E **Multiple Statements:** To run multiple query statements, **highlight all the query statements you want to run together**, and then click the `Run` button.\n\u003E\n\u003E ![assets/analysis_info_queryrun_multi.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_queryrun_multi.png)\n\u003E\n\u003E **Individual Statements:** To run individual query statements, **select the query by placing your cursor within the query statement**, and then click the `Run` button at the top right of the worksheet.\n\u003E\n\u003E ![assets/analysis_info_queryrun.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_queryrun.png)\n\u003E\n\n\n### Step 2 - Run Through the Snowsight Worksheet Time Series Analysis Queries\n\n### Set Session Context\n\nRun the following three statements to ensure the worksheet session is in the right context.\n\n```sql\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n```\n\n### Exploring Raw Time Series Data\n\nWe'll start with a simple **Raw** query that returns time series data between an input start time and end time.\n\n**Raw**: Retrieve time series data between an input start time and end time.\n\n```sql\n/* RAW\nRetrieve time series data between an input start time and end time.\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/analysis_query_rawleft.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_rawleft.png)\n\n### Time Series Statistical Aggregates\n\nThe following set of queries contains various [Aggregate Functions](https://docs.snowflake.com/en/sql-reference/functions-aggregation) covering **counts, math operations, distributions, and watermarks**.\n\n**Counts**: Retrieve count and distinct counts within the time boundary.\n\n```sql\n/* COUNT AND COUNT DISTINCT\nRetrieve count and distinct counts within the time boundary.\n\nCOUNT - Count of all values\nCOUNT DISTINCT - Count of unique values\n\nNote: Counts can work with both varchar and numeric data types.\n*/\nSELECT TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP,\n    COUNT(VALUE) AS COUNT_VALUE,\n    COUNT(DISTINCT VALUE) AS COUNT_DISTINCT_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n```\n\n![assets/analysis_query_aggcount.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggcount.png)\n\n**Math Operations**: Retrieve statistical detail for the readings within the time boundary.\n\n```sql\n/* MIN/MAX/AVG/SUM\nRetrieve statistical aggregates for the readings within the time boundary using math operations.\n\nMIN - Minimum value\nMAX - Maximum value\nAVG - Average of values (mean)\nSUM - Sum of values\n\nNote: Aggregates can work with numerical data types.\n*/\nSELECT TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP,\n    MIN(VALUE_NUMERIC) AS MIN_VALUE,\n    MAX(VALUE_NUMERIC) AS MAX_VALUE,\n    SUM(VALUE_NUMERIC) AS SUM_VALUE,\n    AVG(VALUE_NUMERIC) AS AVG_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS \nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n```\n\n![assets/analysis_query_aggminmaxavgsum.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggminmaxavgsum.png)\n\n**Relative Frequency**: Consider the use case of **calculating the frequency and relative frequency** of each value within a specific time frame, to **determine how often the value occurs**.\n\nFind the value that occurs most frequently within a time frame.\n\n```sql\n/* RELATIVE FREQUENCY\nConsider the use case of calculating the frequency and relative frequency of each value\nwithin a specific time frame, to determine how often the value occurs.\n\nFind the value that occurs most frequently within a time frame.\n*/\nSELECT \n    TAGNAME,\n    VALUE,\n    COUNT(VALUE) AS FREQUENCY,\n    COUNT(VALUE) / SUM(COUNT(VALUE)) OVER(PARTITION BY TAGNAME) AS RELATIVE_FREQUENCY\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME IN ('/IOT/SENSOR/TAG501')\nAND TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND VALUE IS NOT NULL\nGROUP BY TAGNAME, VALUE\nORDER BY TAGNAME, FREQUENCY DESC;\n```\n\n**Relative Frequency**: Value 424 occurs most, with a frequency of 13 and a relative frequency of 21.6%. \n\n![assets/analysis_query_relativefrequency.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_relativefrequency.png)\n\n\u003E \n\u003E \n\u003E #### INFO: Query Result Data Contract\n\u003E\n\u003E The following **two** queries are written with a standard return set of columns, namely **TAGNAME, TIMESTAMP, and VALUE**. This is a way to structure your query results format if **looking to build an API for time series data**, similar to a data contract with consumers.\n\u003E\n\u003E The **TAGNAME** is updated to show that a calculation has been applied to the returned values, and multiple aggregations can be grouped together using [UNION ALL](https://docs.snowflake.com/en/sql-reference/operators-query).\n\u003E\n\n**Distribution Statistics**: Retrieve distribution sample statistics within the time boundary.\n\n```sql\n/* DISTRIBUTIONS - sample distributions statistics\nRetrieve distribution sample statistics within the time boundary.\n\nPERCENTILE_50 - 50% of values are less than this value.\nPERCENTILE_95 - 95% of values are less than this value.\nSTDDEV - Closeness to the mean/average of the distribution.\nVARIANCE - Spread between numbers in the time boundary.\nKURTOSIS - Measure of outliers occuring.\nSKEW - Left (negative) and right (positive) distribution skew.\n\nNote: Distributions can work with numerical data types.\n*/\nSELECT TAGNAME || '~PERCENTILE_50_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, APPROX_PERCENTILE(VALUE_NUMERIC, 0.5) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~PERCENTILE_95_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, APPROX_PERCENTILE(VALUE_NUMERIC, 0.95) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~STDDEV_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, STDDEV(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~VARIANCE_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, VARIANCE(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~KURTOSIS_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, KURTOSIS(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~SKEW_1HOUR' AS TAGNAME, TO_TIMESTAMP_NTZ('2024-01-01 01:00:00') AS TIMESTAMP, SKEW(VALUE_NUMERIC) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n```\n\n![assets/analysis_query_aggdistributions.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggdistributions.png)\n\n**Watermarks**: Consider the use case of **determining a sensor variance over time** by calculating the latest (high watermark) and earliest (low watermark) readings within a time boundary.\n\nRetrieve both the high watermark (latest time stamped value) and low watermark (earliest time stamped value) readings within the time boundary.\n\n```sql\n/* WATERMARKS\nRetrieve both the high watermark (latest time stamped value) and low watermark (earliest time stamped value) readings within the time boundary.\n\nMAX_BY - High Watermark - latest reading in the time boundary\nMIN_BY - Low Watermark - earliest reading in the time boundary\n*/\nSELECT TAGNAME || '~MAX_BY_1HOUR' AS TAGNAME, MAX_BY(TIMESTAMP, TIMESTAMP) AS TIMESTAMP, MAX_BY(VALUE, TIMESTAMP) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nUNION ALL\nSELECT TAGNAME || '~MIN_BY_1HOUR' AS TAGNAME, MIN_BY(TIMESTAMP, TIMESTAMP) AS TIMESTAMP, MIN_BY(VALUE, TIMESTAMP) AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TAGNAME\nORDER BY TAGNAME;\n```\n\n![assets/analysis_query_aggwatermark.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_aggwatermark.png)\n\n\n### Time Series Analytics using Window Functions\n\n[Window Functions](https://docs.snowflake.com/en/sql-reference/functions-analytic) enable aggregates to operate over groups of data, looking forward and backwards in the ordered data rows, and returning a single result for each group. More detail available in [Using Window Functions](https://docs.snowflake.com/en/user-guide/functions-window-using).\n\n* The **OVER()** clause defines the group of rows used in the calculation.\n* The **PARTITION BY** sub-clause allows us to divide that window into sub-windows.\n* The **ORDER BY** clause can be used with ASC (ascending) or DESC (descending), and allows ordering of the partition sub-window rows.\n\n**Lag and Lead**: Consider the use case where you need to analyze the **changes in the readings** of a specific IoT sensor **over a short period** (say 10 seconds) by examining the **current, previous, and next values** of the readings.\n\nAccess data in previous (LAG) or subsequent (LEAD) rows without having to join the table to itself.\n\n```sql\n/* WINDOW FUNCTIONS - LAG AND LEAD\nConsider the use case where you need to analyze the changes in the readings of a specific IoT sensor\nover a short period (say 10 seconds) by examining the current, previous, and next values of the readings.\n\nAccess data in previous (LAG) or subsequent (LEAD) rows without having to join the table to itself.\n\nLAG - Prior time period value\nLEAD - Next time period value\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    LAG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LAG_VALUE,\n    LEAD(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LEAD_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/analysis_query_windowlaglead.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowlaglead.png)\n\n**First and Last Value**: Consider the use case of **change detection** where you want to **detect any sudden pressure changes** in comparison to initial and final values in a specific time frame.\n\nFor this you would use the **FIRST_VALUE** and **LAST_VALUE** window functions to retrieve the first and last values within the time boundary to perform such an analysis.\n\n```sql\n/* FIRST_VALUE AND LAST_VALUE\nConsider the use case of change detection where you want to detect any sudden pressure changes in comparison to initial and final values in a specific time frame.\n\nFor this you would use the FIRST_VALUE and LAST_VALUE window functions to retrieve the first and last values within the time boundary to perform such an analysis.\n\nFIRST_VALUE - First value in the time boundary\nLAST_VALUE - Last value in the time boundary\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE, \n    FIRST_VALUE(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS FIRST_VALUE,\n    LAST_VALUE(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP) AS LAST_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C '2024-01-01 00:00:10'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/analysis_query_windowfirstlast.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowfirstlast.png)\n\n**Rows Between - Preceding and Following**: Consider the use case, where the data you have is **second by second** sensor readings, and you want to compute the **rolling 6 second average** of sensor readings over a specific time frame to **detect trends and patterns** in the data.\n\nIn cases where the data **doesn't have any gaps**, you can use **ROWS BETWEEN** window frames to perform these **rolling calculations**.\n\nCreate a rolling AVG for the five preceding and following rows, inclusive of the current row.\n\n```sql\n/* WINDOW FUNCTIONS - ROWS BETWEEN\nConsider the use case, where the data you have second by second sensor reading and you want to compute the\nrolling 6 second average of sensor readings over a specific time frame to detect trends and patterns in the data. \n\nIn cases where the data doesn't have any gaps like this one, you can use ROW BETWEEN\nwindow frames to perform these rolling calculations.\n\nCreate a rolling AVG for the five preceding and following rows, inclusive of the current row.\n\nROW_AVG_PRECEDING - Rolling AVG from 5 preceding rows and current row\nROW_AVG_FOLLOWING - Rolling AVG from current row and 5 following rows\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS ROW_AVG_PRECEDING,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN CURRENT ROW AND 5 FOLLOWING) AS ROW_AVG_FOLLOWING\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C '2024-01-01 00:01:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n\u003E \n\u003E \n\u003E #### INFO: Snowsight Statistics\n\u003E\n\u003E **Snowflake [Snowsight](https://docs.snowflake.com/en/user-guide/ui-snowsight)** will provide high level statistics and histograms for columns of data, as well as selected cells of numerical data, to the right of the returned result set.\n\u003E\n\u003E More detail at [Exploring the worksheet results](https://docs.snowflake.com/en/user-guide/ui-snowsight-query#exploring-the-worksheet-results).\n\u003E\n\n**Selecting the first six row cells will show the matching ROWS BETWEEN averages preceding and following**.\n\n![assets/analysis_query_windowrowsbetween.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrowsbetween.png)\n\n\u003E \n\u003E \n\u003E Now assume a scenario, where there are **time gaps or missing data** received from a sensor. Such as a sensor that sends roughly every 5 seconds and experiences a fault.\n\u003E\n\u003E In this example I am using [DATE_PART](https://docs.snowflake.com/en/sql-reference/functions/date_part) to exclude seconds 20, 45, and 55 from the data.\n\u003E\n\u003E ```sql\n\u003E SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE\n\u003E FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n\u003E WHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\n\u003E AND TIMESTAMP \u003C '2024-01-01 00:02:00'\n\u003E AND TAGNAME = '/IOT/SENSOR/TAG101'\n\u003E AND DATE_PART('SECOND', TIMESTAMP) NOT IN (20, 45, 55)\n\u003E ORDER BY TAGNAME, TIMESTAMP;\n\u003E ```\n\u003E\n\u003E ![assets/analysis_query_windowrangebetween_gaps.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_gaps.png)\n\u003E\n\u003E Now say you want to perform an aggregation to **calculate the 1 minute rolling average** of sensor readings,\nover a specific time frame to detect trends and patterns in the data.\n\u003E\n\u003E **ROWS BETWEEN** may NOT yield correct results, as the number of rows that make up the 1 minute interval could be inconsistent. In this case for a 5 second tag without gaps, you might have assumed 12 rows would make up 1 minute.\n\u003E\n\n#### NOTE: At the time of publishing this lab, in late May 2024, the RANGE BETWEEN function was in Private Preview. We have included it in the lab content for reference. If you receive errors when running the RANGE BETWEEN queries, it may NOT be released in your region just yet, it is targeted to be Public Preview soon. Please review the [Snowflake Preview Features](https://docs.snowflake.com/en/release-notes/preview-features) page for more information.\n\n\u003E \n\u003E \n\u003E This is where **RANGE BETWEEN** can be used with intervals of time that can be added or subtracted from timestamps.\n\u003E\n\u003E **RANGE BETWEEN** differs from **ROWS BETWEEN** in that it can:\n\u003E * **Handle time gaps** in data being analyzed.\n\u003E   - For example, if a sensor is faulty or sends data at inconsistent intervals.\n\u003E * Allow for **reporting frequencies that differ** from the data frequency.\n\u003E   - For example, data at 5 second frequency that you want to aggregate the prior 1 minute.\n\u003E\n\u003E ![assets/analysis_info_range_between.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_info_range_between.png)\n\u003E\n\u003E More detail at [Interval Constants](https://docs.snowflake.com/en/sql-reference/data-types-datetime#interval-constants)\n\u003E\n\n**Range Between - 1 MIN Rolling Average and Sum showing gap differences**: Create a rolling AVG and SUM for the time **INTERVAL** 1 minute preceding, inclusive of the current row. Assuming the preceding 12 rows would make up 1 minute of data.\n\n```sql\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '1 MIN' PRECEDING AND CURRENT ROW) AS RANGE_AVG_1MIN,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) AS ROW_AVG_1MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '1 MIN' PRECEDING AND CURRENT ROW) AS RANGE_SUM_1MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) AS ROW_SUM_1MIN\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND DATE_PART('SECOND', TIMESTAMP) NOT IN (20, 45, 55)\nAND TAGNAME = '/IOT/SENSOR/TAG101'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n**The first minute of data aligns for both RANGE BETWEEN and ROWS BETWEEN, however, after the first minute the rolling values will start to show variances due to the introduced time gaps**.\n\n![assets/analysis_query_windowrangebetween_error.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_error.png)\n\n##### CHART: Rolling 1 MIN Average and Sum - showing differences between RANGE BETWEEN and ROWS BETWEEN\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select the `VALUE` column and set the Aggregation to `Max`.\n3. Select `+ Add column` and select `RANGE_AVG_1MIN` and set Aggregation to `Max`.\n4. Select `+ Add column` and select `ROW_AVG_1MIN` and set Aggregation to `Max`.\n\n**The chart shows variances between the RANGE BETWEEN and ROWS BETWEEN occuring after the first minute**.\n\n![assets/analysis_chart_rangerow_1min.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_rangerow_1min.png)\n\n**Range Between - 5 MIN Rolling Average and Sum**: Let's expand on RANGE BETWEEN and create a rolling AVG and SUM for the time **INTERVAL** five minutes preceding, inclusive of the current row.\n\n```sql\n/* WINDOW FUNCTIONS - RANGE BETWEEN\nLet's expand on RANGE BETWEEN and create a rolling AVG and SUM for the time **INTERVAL** five minutes preceding, inclusive of the current row.\n\nINTERVAL - 5 MIN AVG and SUM preceding the current row\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    AVG(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '5 MIN' PRECEDING AND CURRENT ROW) AS RANGE_AVG_5MIN,\n    SUM(VALUE_NUMERIC) OVER (\n        PARTITION BY TAGNAME ORDER BY TIMESTAMP\n        RANGE BETWEEN INTERVAL '5 MIN' PRECEDING AND CURRENT ROW) AS RANGE_SUM_5MIN\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C= '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG401'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/analysis_query_windowrangebetween_5min.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_windowrangebetween_5min.png)\n\n##### CHART: Rolling 5 MIN Average\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select the `VALUE` and set the Aggregation to `Max`.\n3. Select `+ Add column` and select `RANGE_AVG_5MIN` and set Aggregation to `Max`.\n\n**A rolling average could be useful in scenarios where you are trying to detect EXCEEDANCES in equipment operating limits over periods of time, such as a maximum pressure limit**.\n\n![assets/analysis_chart_range_5min.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_range_5min.png)\n\n### Downsampling Time Series Data\n\nDownsampling is used to **decrease the frequency of time samples**, such as from seconds to minutes, by placing time series data into fixed time intervals using aggregate operations on the existing values within each time interval.\n\n**Time Binning - 5 min Aggregate**: Consider a use case where you want to obtain a broader view of a high frequency pressure gauge, by aggregating data into evenly spaced intervals to find trends over time.\n\nCreate a downsampled time series data set with 5 minute aggregates, showing the **START and END timestamp label** of each interval.\n\n```sql\n/* TIME BINNING - 5 min AGGREGATE with START and END label\nCreate a downsampled time series data set with 5 minute aggregates, showing the START and END timestamp label of each interval.\n\nCOUNT - Count of values within the time bin\nSUM - Sum of values within the time bin\nAVG - Average of values (mean) within the time bin\nPERCENTILE_95 - 95% of values are less than this within the time bin\n*/\nSELECT TAGNAME,\n    TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'START') AS START_TIMESTAMP,\n    TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'END') AS END_TIMESTAMP,\n    COUNT(*) AS COUNT_VALUE,\n    SUM(VALUE_NUMERIC) AS SUM_VALUE,\n    AVG(VALUE_NUMERIC) AS AVG_VALUE,\n    APPROX_PERCENTILE(VALUE_NUMERIC, 0.95) AS PERCENTILE_95_VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\nAND TIMESTAMP \u003C '2024-01-01 01:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nGROUP BY TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'START'), TIME_SLICE(TIMESTAMP, 5, 'MINUTE', 'END'), TAGNAME\nORDER BY TAGNAME, START_TIMESTAMP;\n```\n\n**For a one second tag (3600 data points over an hour), the results will show in five minute intervals containing 300 data points each, along with aggregates for counts, sum, average, and 95th percentile values**.\n\n![assets/analysis_query_timebin.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_timebin.png)\n\n\n### Aligning Time Series Data\n\nOften you will need to **align two data sets** that may have differing time frequencies. To do this you can utilize the **Time Series ASOF JOIN** to pair closely matching records based on timestamps.\n\n**Joining Time Series Data with ASOF JOIN**: Consider the use case where you want to align a one second and five second pressure gauge to determine if there is a correlation.\n\nUsing the `ASOF JOIN`, join two data sets by applying a `MATCH_CONDITION` to pair closely aligned timestamps and values.\n\n```sql\n/* ASOF JOIN - Align a 1 second tag with a 5 second tag\nConsider the use case where you want to align a one second and five second pressure gauge to determine if there is a correlation.\n\nUsing the `ASOF JOIN`, join two data sets by applying a `MATCH_CONDITION` to pair closely aligned timestamps and values.\n*/\nSELECT ONE_SEC.TAGNAME AS ONE_SEC_TAGNAME, ONE_SEC.TIMESTAMP AS ONE_SEC_TIMESTAMP, ONE_SEC.VALUE_NUMERIC AS ONE_SEC_VALUE, FIVE_SEC.VALUE_NUMERIC AS FIVE_SEC_VALUE, FIVE_SEC.TAGNAME AS FIVE_SEC_TAGNAME, FIVE_SEC.TIMESTAMP AS FIVE_SEC_TIMESTAMP\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS ONE_SEC\nASOF JOIN (\n    -- 5 sec tag data\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TAGNAME = '/IOT/SENSOR/TAG101'\n    ) FIVE_SEC\nMATCH_CONDITION(ONE_SEC.TIMESTAMP \u003E= FIVE_SEC.TIMESTAMP)\nWHERE ONE_SEC.TAGNAME = '/IOT/SENSOR/TAG301'\nAND ONE_SEC.TIMESTAMP \u003E= '2024-01-03 09:15:00'\nAND ONE_SEC.TIMESTAMP \u003C= '2024-01-03 09:45:00'\nORDER BY ONE_SEC.TIMESTAMP;\n```\n\n![assets/analysis_query_asof_align.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_asof_align.png)\n\n##### CHART: Aligned Time Series Data\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data set the first Data column to `ONE_SEC_VALUE` with an Aggregation of `Max`.\n3. Set the X-Axis to `ONE_SEC_TIMESTAMP` and a Bucketing of `Second`\n3. Select `+ Add column` and select `FIVE_SEC_VALUE` and set Aggregation to `Max`.\n\n**One sensor is showing a significant drop whilst the other is showing an increase to a peak at similar times, which could potentially be an anomaly**.\n\n![assets/analysis_chart_align.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_align.png)\n\n### Gap Filling\n\nTime gap filling is the process of generating timestamps for a given start and end time boundary, and joining to a tag with less frequent timestamp values, and filling missing / gap timestamps with a prior value. This can also be referred to as **Upsampling or Forward Filling**.\n\n**Gap Filling**: Generate timestamps given a start and end time boundary, and use ASOF JOIN to a tag dataset with less frequent values, to forward fill using last observed value carried forward (LOCF).\n\n```sql\n/* GAP FILLING - 1 SEC TIMESTAMPS WITH 5 SEC TAG\nGenerate timestamps given a start and end time boundary, and use ASOF JOIN\nto a tag dataset with less frequent values, to forward fill using last observed value carried forward (LOCF).\n\n1 - SET TIME_PERIODS - A variable passed into the query to determine the number of time stamps generated for gap filling.\n2 - Run the LOCF query passing in the TIME_PERIODS to the generated calendar\n*/\n-- SET TIME_PERIODS IN SECONDS\nSET TIME_PERIODS = (SELECT TIMESTAMPDIFF('SECOND', '2024-01-01 00:00:00'::TIMESTAMP_NTZ, '2024-01-01 00:00:00'::TIMESTAMP_NTZ + INTERVAL '1 MINUTE'));\n\n-- LAST OBSERVED VALUE CARRIED FORWARD (LOCF) - IGNORE NULLS\nWITH TIMES AS (\n    -- 1 SECOND TIMESTAMPS USING TIME PERIODS\n    SELECT\n    DATEADD('SECOND', ROW_NUMBER() OVER (ORDER BY SEQ8()) - 1, '2024-01-01')::TIMESTAMP_NTZ AS TIMESTAMP,\n    '/IOT/SENSOR/TAG101' AS TAGNAME\n    FROM TABLE(GENERATOR(ROWCOUNT =\u003E $TIME_PERIODS))\n),\nDATA AS (\n    -- 5 SECOND TAG\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE,\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TIMESTAMP \u003E= '2024-01-01 00:00:00'\n    AND TIMESTAMP \u003C '2024-01-01 00:01:00'\n    AND TAGNAME = '/IOT/SENSOR/TAG101'\n)\nSELECT TIMES.TIMESTAMP,\n    A.TAGNAME AS TAGNAME,\n    L.VALUE,\n    A.VALUE AS LOCF_VALUE\nFROM TIMES\nLEFT JOIN DATA L ON TIMES.TIMESTAMP = L.TIMESTAMP AND TIMES.TAGNAME = L.TAGNAME\nASOF JOIN DATA A MATCH_CONDITION(TIMES.TIMESTAMP \u003E= A.TIMESTAMP) ON TIMES.TAGNAME = A.TAGNAME\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/analysis_query_gapfill_locf.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_gapfill_locf.png)\n\n\n### Time Series Forecasting\n\n**[Time-Series Forecasting](https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting)** employs a machine learning (ML) algorithm to predict future data by using historical time series data.\n\n**Forecasting** is part of **[ML Functions](https://docs.snowflake.com/en/guides-overview-ml-functions#time-series-functions) in Snowflake Cortex, Snowflake’s intelligent, fully-managed AI and ML service**.\n\n**Forecasting**: Consider a use case where you want to **predict expected production output** based on a flow sensor. In this case, you could **generate a time series forecast** for a single tag looking forward one day for a flow sensor.\n\n1. Create a forecast **training data set** from historical data.\n\n```sql\n/* FORECAST DATA - Training Data Set - /IOT/SENSOR/TAG401\nA single tag of data for two weeks.\n\n1 - Create a forecast training data set from historical data. This will use a temporary table.\n*/\nCREATE OR REPLACE TEMPORARY TABLE HOL_TIMESERIES.ANALYTICS.TEMP_TS_TAG_TRAIN AS\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC AS VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME = '/IOT/SENSOR/TAG401'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n2. Create a Time-Series [SNOWFLAKE.ML.FORECAST](https://docs.snowflake.com/en/sql-reference/classes/forecast/commands/create-forecast) model using the training data set.\n\n```sql\n/* FORECAST MODEL - Training Data Set - /IOT/SENSOR/TAG401\n2 - Create a Time-Series SNOWFLAKE.ML.FORECAST model using the training data set.\n\nINPUT_DATA - The data set used for training the forecast model\nSERIES_COLUMN - The column that splits multiple series of data, such as different TAGNAMES\nTIMESTAMP_COLNAME - The column containing the Time Series times\nTARGET_COLNAME - The column containing the target value\n\nTraining the Time Series Forecast model may take 2-3 minutes in this case.\n*/\nCREATE OR REPLACE SNOWFLAKE.ML.FORECAST HOL_TIMESERIES_FORECAST(\n    INPUT_DATA =\u003E SYSTEM$REFERENCE('TABLE', 'HOL_TIMESERIES.ANALYTICS.TEMP_TS_TAG_TRAIN'),\n    SERIES_COLNAME =\u003E 'TAGNAME',\n    TIMESTAMP_COLNAME =\u003E 'TIMESTAMP',\n    TARGET_COLNAME =\u003E 'VALUE'\n);\n```\n\n\u003E \n\u003E \n\u003E **Training the Time Series Forecast model** may take 2-3 minutes in this case. Indicative training times available at [Training on Multi-Series Data](https://docs.snowflake.com/user-guide/snowflake-cortex/ml-functions/forecasting#training-on-multi-series-data).\n\u003E\n\n3. Test Forecasting model output for one day.\n\n```sql\n/* FORECAST MODEL OUTPUT - Forecast for 1 Day\n3 - Test Forecasting model output for one day.\n\nSERIES_VALUE - Defines the series being forecasted - for example the specific tag\nFORECASTING_PERIODS - The number of periods being forecasted\n*/\nCALL HOL_TIMESERIES_FORECAST!FORECAST(SERIES_VALUE =\u003E TO_VARIANT('/IOT/SENSOR/TAG401'), FORECASTING_PERIODS =\u003E 1440);\n```\n\n4. Create a forecast analysis combining historical data with forecast data using [RESULT_SCAN](https://docs.snowflake.com/en/sql-reference/functions/result_scan).\n\n```sql\n/* FORECAST COMBINED - Combined ACTUAL and FORECAST data\n4 - Create a forecast analysis combining historical data with forecast data.\n\nUNION the historical ACTUAL data with the FORECAST data using RESULT_SCAN\n*/\nSELECT\n    'ACTUAL' AS DATASET,\n    TAGNAME,\n    TIMESTAMP,\n    VALUE,\n    NULL AS FORECAST,\n    NULL AS UPPER\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TAGNAME = '/IOT/SENSOR/TAG401'\nAND TO_DATE(TIMESTAMP) = '2024-01-14'\nUNION ALL\nSELECT\n    'FORECAST' AS DATASET,\n    SERIES AS TAGNAME,\n    TS AS TIMESTAMP,\n    NULL AS VALUE,\n    FORECAST,\n    UPPER_BOUND AS UPPER\nFROM TABLE(RESULT_SCAN(-1))\nORDER BY DATASET, TAGNAME, TIMESTAMP;\n```\n\n##### CHART: Time Series Forecast\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data set the first column to `VALUE` and set the Aggregation to `Max`.\n3. Select the `TIMESTAMP` column and set the Bucketing to `Minute`.\n4. Select `+ Add column` and select `FORECAST` and set Aggregation to `Max`.\n\n**The chart will show a flow sensor with ACTUALS and FORECAST values**.\n\n![assets/analysis_chart_forecast.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_chart_forecast.png)\n\n\n### Ask Copilot\n\n**[Snowflake Copilot](https://docs.snowflake.com/en/user-guide/snowflake-copilot)** is an **LLM-powered assistant** that simplifies data analysis while maintaining robust data governance, and seamlessly integrates into your existing Snowflake workflow.\n\nSnowflake Copilot is **powered by a model fine-tuned by Snowflake that runs securely inside Snowflake Cortex**, Snowflake’s intelligent, fully managed AI service. Snowflake Copilot uses the names of your databases, schemas, tables, and columns and also the data types of your columns to determine what data is available to query.\n\nSnowflake Copilot also has access to [Snowflake documentation](https://docs.snowflake.com/) and can answer general questions about Snowflake or SQL.\n\nFor more information, please review [How to use Snowflake Copilot](https://docs.snowflake.com/en/user-guide/snowflake-copilot#how-to-use-sf-copilot) and [Tips for using Snowflake Copilot](https://docs.snowflake.com/en/user-guide/snowflake-copilot#tips-for-using-sf-copilot).\n\n#### NOTE: At the time of publishing this lab, in late May 2024, Snowflake Copilot was in Public Preview in AWS US regions. We have included it in the lab content for reference. If you do not see \"Ask Copilot\", it may NOT be released in your region just yet. Please review the [Snowflake Preview Features](https://docs.snowflake.com/en/release-notes/preview-features) page for more information.\n\n1. At the top left of the screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\n![assets/analysis_newsheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newsheet.png)\n\n2. At the bottom right of the worksheet, click the **Ask Copilot** button.\n\n![assets/analysis_askcopilot.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_askcopilot.png)\n\n3. A **Snowflake Copilot** tab will appear to the right of the window, at the bottom click **Select Database**.\n\n![assets/analysis_selectdatabase.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_selectdatabase.png)\n\n4. Select the database and schema `HOL_TIMESERIES \u003E ANALYTICS`.\n\n![assets/analysis_database_analytics.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_database_analytics.png)\n\n5. **Try asking Snowflake Copilot the following prompts**, by entering them into the text prompt box. Snowflake Copilot will return a **generated SQL query along with annotations** of how it structures the SQL query.\n\n    - Show me namespace, tag name, time, and latest value for tag /IOT/SENSOR/TAG301\n    - Show me the average values by namespace and tag name\n    - Show me the max value, and time for tag name /IOT/SENSOR/TAG101 on January 10 2024 by tag name\n    - Show me 1hr averages for tag /IOT/SENSOR/TAG301 on January 3 2024 by tag\n\n![assets/analysis_query_copilot.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot.png)\n\n\u003E \n\u003E \n\u003E If **Snowflake Copilot** is in the process of indexing objects, results will return **\"We are in the process of indexing the tables and views in the selected database and schema. Please try again later.\"**.\n\u003E\n\n6. Click the `Run` button below the generated SQL query. If it's correct, please give the generated prompt output a **thumbs up**!\n\n![assets/analysis_query_copilot_run.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot_run.png)\n\n**Copilot** will execute the SQL in the worksheet.\n\n![assets/analysis_query_copilot_hourlybin.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_query_copilot_hourlybin.png)\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E If you encounter issues in the **Time Series Analysis** section, use the following steps to **Troubleshoot**.\n\u003E\n\u003E #### RANGE BETWEEN Query Returning Error: Invalid window frame\n\u003E\n\u003E At the time of publishing this lab, in late May 2024, the RANGE BETWEEN function was in Private Preview. We have included it in the lab content for reference. If you receive errors when running the RANGE BETWEEN queries, it may NOT be released in your region just yet, it is targeted to be Public Preview soon. Please review the [Snowflake Preview Features](https://docs.snowflake.com/en/release-notes/preview-features) page for more information.\n\u003E\n\u003E #### \"Ask Copilot\" is NOT Showing in Worksheets\n\u003E \n\u003E At the time of publishing this lab, in late May 2024, Snowflake Copilot was in Public Preview in AWS US regions. We have included it in the lab content for reference. If you do not see \"Ask Copilot\", it may NOT be released in your region just yet. Please review the [Snowflake Preview Features](https://docs.snowflake.com/en/release-notes/preview-features) page for more information.\n\u003E\n\u003E #### Snowflake Copilot Returns \"We are in the process of indexing the tables and views in the selected database and schema. Please try again later.\"\n\u003E\n\u003E If Snowflake Copilot is in the process of indexing objects, results will return \"We are in the process of indexing the tables and views in the selected database and schema. Please try again later.\".\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Build Your Own Time Series Functions\n\nNow that you have a great understanding of running **Time Series Analysis**, we will now look at deploying time series [User Defined Table Functions (UDTF)](https://docs.snowflake.com/en/developer-guide/udf/udf-overview) that can query time series data in a re-usable manner. Table functions will accept a set of input parameters and perform operations on a data set, and return results in a table format.\n\n![assets/byo_functions.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/byo_functions.png)\n\n#### INFO: Time Series Query Profiles\n\nThe following query profiles will be covered in this section.\n\n| **Query Type** | **Functions** | **Description** |\n| --- | --- | --- |\n| Upsampling / Interpolation | Custom Interpolation Table Function | Time binning aggregations with interpolated values over time intervals. |\n| Downsampling - LTTB | Custom Snowpark Downsampling Table Function | Downsampling to a set number of data points whilst retaining the shape and variability of the time series data. |\n\n\n### Table Functions Deploy\n\nIn this section we'll deploy two types of Time Series [User-Defined Table Functions (UDTF)](https://docs.snowflake.com/en/developer-guide/udf/udf-overview) that will be used to **resample time series data**.\n\n#### Function 1 - SQL - Interpolation / Upsampling Time Series Data\n\n**Upsampling** is used to **increase the frequency** of time samples, such as from hours to minutes, by placing time series data into fixed time intervals using aggregate operations on the values within each time interval. Due to the frequency of samples being increased it has the effect of **creating new values if the interval is more frequent** than the data itself.\n\nIf the interval does not contain a value, it will be **interpolated from the surrounding aggregated data**.\n\n#### Function 2 - Python - Downsampling Time Series Data\n\n**Downsampling** is used to **decrease the frequency** of time samples, such as from seconds to minutes. For the downsampling table function, we will deploy the **Largest Triangle Three Buckets (LTTB)** downsampling algorithm, which is part of the **[Snowpark Python](https://repo.anaconda.com/pkgs/snowflake/) - plotly-resampler** package.\n\nThe **LTTB** algorithm **reduces the number of visual data points in a time series data set, whilst retaining the shape and variability of the time series data**. It's useful for reducing large time series data sets for charting purposes where the consumer system may have reduced memory resources.\n\n\n### Step 1 - Deploy Time Series Functions and Procedures\n\n1. In **VS Code** open the worksheet `worksheets/hol_timeseries_5_functions.sql`\n\n2. Click the `Execute All Statements` button at the top right of the worksheet to **deploy all functions and procedures**.\n\n![assets/function_info_runall.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_info_runall.png)\n\n#### INFO: Time Series Functions and Procedures\n\nThe following functions and procedures have been deployed.\n\n\u003E \n\u003E \n\u003E #### INFO: SQL INTERPOLATE Table Function\n\u003E\n\u003E The **INTERPOLATE Table Function** is using the [ASOF JOIN](https://docs.snowflake.com/en/sql-reference/constructs/asof-join) for each time interval to **look both backwards (LAST_VALUE) and forwards (NEXT_VALUE) in time**, to calculate the time and value difference at each time interval, which is then used to generate a smooth linear interpolated value.\n\u003E\n\u003E The **INTERPOLATE Table Function** will return both **linear interpolated values** and **last observed value carried forward (LOCF) values**.\n\u003E\n\n```sql\n/*##############################\n-- Create Interpolate Table Function\n##############################*/\nCREATE OR REPLACE FUNCTION HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE (\n    V_TAGLIST VARCHAR,\n    V_START_TIMESTAMP TIMESTAMP_NTZ,\n    V_END_TIMESTAMP TIMESTAMP_NTZ,\n    V_INTERVAL NUMBER,\n    V_BUCKETS NUMBER\n)\nRETURNS TABLE (\n    TIMESTAMP TIMESTAMP_NTZ,\n    TAGNAME VARCHAR,\n    LINEAR_VALUE FLOAT,\n    LOCF_VALUE FLOAT,\n    LAST_TIMESTAMP TIMESTAMP_NTZ\n)\nLANGUAGE SQL\nAS\n$$\nWITH\nTSTAMPS AS (\n    SELECT \n        DATEADD('SEC', V_INTERVAL * ROW_NUMBER() OVER (ORDER BY SEQ8()) - V_INTERVAL, V_START_TIMESTAMP) AS TIMESTAMP\n    FROM TABLE(GENERATOR(ROWCOUNT =\u003E V_BUCKETS))\n),\nTAGLIST AS (\n    SELECT\n        TRIM(TAGLIST.VALUE) AS TAGNAME\n    FROM\n        TABLE(SPLIT_TO_TABLE(V_TAGLIST, ',')) TAGLIST\n),\nTIMES AS (\n    SELECT\n        TSTAMPS.TIMESTAMP,\n        TAGLIST.TAGNAME\n    FROM\n        TSTAMPS\n        CROSS JOIN TAGLIST\n),\nLAST_VALUE AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        RAW_DATA.TIMESTAMP RAW_TS,\n        RAW_DATA.TAGNAME,\n        RAW_DATA.VALUE_NUMERIC\n    FROM\n        TIMES ASOF JOIN HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS RAW_DATA\n            MATCH_CONDITION(TIMES.TIMESTAMP \u003E= RAW_DATA.TIMESTAMP)\n            ON TIMES.TAGNAME = RAW_DATA.TAGNAME\n    WHERE\n        RAW_DATA.TIMESTAMP \u003E= V_START_TIMESTAMP\n    AND RAW_DATA.TIMESTAMP \u003C= V_END_TIMESTAMP\n),\nNEXT_VALUE AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        RAW_DATA.TIMESTAMP RAW_TS,\n        RAW_DATA.TAGNAME,\n        RAW_DATA.VALUE_NUMERIC\n    FROM\n        TIMES ASOF JOIN HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS RAW_DATA\n            MATCH_CONDITION(TIMES.TIMESTAMP \u003C= RAW_DATA.TIMESTAMP)\n            ON TIMES.TAGNAME = RAW_DATA.TAGNAME\n    WHERE\n        RAW_DATA.TIMESTAMP \u003E= V_START_TIMESTAMP\n    AND RAW_DATA.TIMESTAMP \u003C= V_END_TIMESTAMP\n),\nCOMB_VALUES AS (\n    SELECT\n        TIMES.TIMESTAMP,\n        TIMES.TAGNAME,\n        LV.VALUE_NUMERIC LAST_VAL,\n        LV.TIMESTAMP LV_TS,\n        LV.RAW_TS LV_RAW_TS,\n        NV.VALUE_NUMERIC NEXT_VAL,\n        NV.TIMESTAMP NV_TS,\n        NV.RAW_TS NV_RAW_TS\n    FROM TIMES\n    INNER JOIN LAST_VALUE LV ON TIMES.TIMESTAMP = LV.TIMESTAMP AND TIMES.TAGNAME = LV.TAGNAME\n    INNER JOIN NEXT_VALUE NV ON TIMES.TIMESTAMP = NV.TIMESTAMP AND TIMES.TAGNAME = NV.TAGNAME\n),\nINTERP AS (\n    SELECT\n        TIMESTAMP,\n        TAGNAME,\n        TIMESTAMPDIFF(SECOND, LV_RAW_TS, NV_RAW_TS) TDIF_BASE,\n        TIMESTAMPDIFF(SECOND, LV_RAW_TS, TIMESTAMP) TDIF,\n        LV_TS,\n        NV_TS,\n        LV_RAW_TS,\n        LAST_VAL,\n        NEXT_VAL,\n        DECODE(TDIF, 0, LAST_VAL, LAST_VAL + (NEXT_VAL - LAST_VAL) / TDIF_BASE * TDIF) IVAL\n    FROM\n        COMB_VALUES\n)\nSELECT\n    TIMESTAMP,\n    TAGNAME,\n    IVAL LINEAR_VALUE,\n    LAST_VAL LOCF_VALUE,\n    LV_RAW_TS LAST_TIMESTAMP\nFROM\n    INTERP\n$$;\n```\n\n\u003E \n\u003E \n\u003E #### INFO: SQL INTERPOLATE Procedure\n\u003E\n\u003E The **INTERPOLATE Procedure** can calculate the number of time buckets within a time boundary based on the interval specified. It then calls the **INTERPOLATE** table function, and depending on the **V_INTERP_TYPE** variable, it will return either the linear interpolated values or last observed value carried forward (LOCF). **Default is LOCF**.\n\u003E\n\n```sql\n/*##############################\n-- Create Interpolate Procedure\n-- Interpolate helper procedure to accept start and end times, and return either LOCF or Linear Interpolated Values\n##############################*/\nCREATE OR REPLACE PROCEDURE HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE (\n    V_TAGLIST VARCHAR,\n    V_FROM_TIME TIMESTAMP_NTZ,\n    V_TO_TIME TIMESTAMP_NTZ,\n    V_INTERVAL NUMBER,\n    V_INTERP_TYPE VARCHAR\n)\nRETURNS TABLE (\n    TIMESTAMP TIMESTAMP_NTZ,\n    TAGNAME VARCHAR,\n    VALUE FLOAT\n)\nLANGUAGE SQL\nAS\n$$\nDECLARE\nTIME_BUCKETS NUMBER;\nRES RESULTSET;\nBEGIN\n    TIME_BUCKETS := CEIL((TIMESTAMPDIFF('SEC', :V_FROM_TIME, :V_TO_TIME) + 1) / :V_INTERVAL);\n\n    IF (:V_INTERP_TYPE = 'LINEAR') THEN\n        -- LINEAR\n        RES := (SELECT TIMESTAMP, TAGNAME, LINEAR_VALUE AS VALUE FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE(:V_TAGLIST, :V_FROM_TIME, :V_TO_TIME, :V_INTERVAL, :TIME_BUCKETS)) ORDER BY TAGNAME, TIMESTAMP);\n    ELSE\n        -- LOCF\n        RES := (SELECT TIMESTAMP, TAGNAME, LOCF_VALUE AS VALUE FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE(:V_TAGLIST, :V_FROM_TIME, :V_TO_TIME, :V_INTERVAL, :TIME_BUCKETS)) ORDER BY TAGNAME, TIMESTAMP);\n    END IF;\n\n    RETURN TABLE(RES);\nEND;\n$$;\n```\n\n\u003E \n\u003E \n\u003E #### INFO: Python Largest Triangle Three Buckets (LTTB) Function\n\u003E\n\u003E The **Largest Triangle Three Buckets (LTTB) downsampling** function uses a [Vectorized Python UDTF](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-tabular-vectorized) with an LTTB handler built using the **[Snowpark Python](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-tabular-vectorized) - plotly-resampler** package. The **LTTB** algorithm **reduces the number of visual data points in a time series data set, whilst retaining the shape and variability of the time series data**.\n\u003E\n\u003E **LTTB** package is available in the [Anaconda Snowflake Snowpark for Python Channel](https://repo.anaconda.com/pkgs/snowflake/) via **plotly-resampler** and runs securely inside Snowflake warehouses when executed.\n\u003E\n\u003E The original code for LTTB is available at [Sveinn Steinarsson - GitHub](https://github.com/sveinn-steinarsson/flot-downsample).\n\u003E\n\n```sql\n/*##############################\n-- LTTB Downsampling Table Function\n##############################*/\nCREATE OR REPLACE FUNCTION HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_LTTB (\n    TIMESTAMP NUMBER,\n    VALUE FLOAT,\n    SIZE NUMBER\n) \nRETURNS TABLE (\n    TIMESTAMP NUMBER,\n    VALUE FLOAT\n)\nLANGUAGE PYTHON\nRUNTIME_VERSION = 3.11\nPACKAGES = ('pandas', 'plotly-resampler')\nHANDLER = 'lttb_run'\nAS $$\nfrom _snowflake import vectorized\nimport pandas as pd\nfrom plotly_resampler.aggregation.algorithms.lttb_py import LTTB_core_py\n\nclass lttb_run:\n    @vectorized(input=pd.DataFrame)\n\n    def end_partition(self, df):\n        if df.SIZE.iat[0] \u003E= len(df.index):\n            return df[['TIMESTAMP','VALUE']]\n        else:\n            idx = LTTB_core_py.downsample(\n                df.TIMESTAMP.to_numpy(),\n                df.VALUE.to_numpy(),\n                n_out=df.SIZE.iat[0]\n            )\n            return df[['TIMESTAMP','VALUE']].iloc[idx]\n$$;\n```\n\n\n### Step 2 - Copy Worksheet Content To Snowsight Worksheet\n\n**With the functions deployed, we can look at using them to query time series data**.\n\n#### This section will be executed within a Snowflake Snowsight Worksheet\n\n1. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`\n\n![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\n2. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\n![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\n3. In **VS Code** open the worksheet `worksheets/hol_timeseries_6_function_queries.sql`\n\n4. **Copy** the contents of the worksheet to **clipboard**, and paste it into the newly created **Worksheet in Snowsight**\n\n\n### Step 3 - Query Time Series Data Using Deployed Functions and Procedures\n\n### Set Session Context\n\nRun the following three statements to ensure the worksheet session is in the right context.\n\n```sql\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n```\n\n### Upsampling / Interpolation Query\n\nUpsampling is used to **increase the frequency of time samples**.\n\nThe first set of queries use the **INTERPOLATE table functions and procedures**\nto produce values for upsampling both **last observed values carried forward (LOCF)** and\n**LINEAR interpolated smoothing** values between data points.\n\nCall the interpolate table function to return both the **linear interpolated values and last observed value carried forward (LOCF)**.\n\n```sql\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n/* INTERPOLATE TABLE FUNCTION\nCall the interpolate table function to return both the linear interpolated values and last observed value carried forward (LOCF).\n*/\nSELECT * FROM TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_INTERPOLATE('/IOT/SENSOR/TAG401', '2024-01-01 12:10:00'::TIMESTAMP_NTZ, '2024-01-01 13:10:00'::TIMESTAMP_NTZ, 10, 362)) ORDER BY TAGNAME, TIMESTAMP;\n```\n\n![assets/function_query_direct.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_query_direct.png)\n\n##### CHART: Interpolation - Linear and LOCF\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select `TIMESTAMP` and set Bucketing to `Second`\n3. Under Data select `LINEAR_VALUE` and set the Aggregation to `Max`.\n4. Select `+ Add column` and select `LOCF_VALUE` and set Aggregation to `Max`.\n\n**The chart will display both LINEAR and LOCF for interpolated values between data points**.\n\n![assets/function_chart_linearlocf.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_linearlocf.png)\n\n\n### Interpolation - Last Observed Value Carried Forward (LOCF) Query\n\nThe **Interpolation Procedure** will accept a start time and end time, along with a bucket interval size in seconds.\n\nIt will then calculate the number of buckets within the time boundary, and call the Interpolate table function.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LOCF` Interpolate type.\n\n```sql\n/* INTERPOLATE PROCEDURE - LOCF\nThe Interpolation Procedure will accept a start time and end time, along with a bucket interval size in seconds.\n\nIt will then calculate the number of buckets within the time boundary, and call the Interpolate table function.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LOCF` Interpolate type.\n*/\nCALL HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE(\n    -- V_TAGLIST\n    '/IOT/SENSOR/TAG401',\n    -- V_FROM_TIME\n    '2024-01-01 12:10:00',\n    -- V_TO_TIME\n    '2024-01-01 13:10:00',\n    -- V_INTERVAL\n    10,\n    -- V_INTERP_TYPE\n    'LOCF'\n);\n```\n\n##### CHART: Interpolation - LOCF\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select `VALUE` and set the Aggregation to `Max`.\n\n**The chart will display a LOCF value where the prior value is interpolated between data points**.\n\n![assets/function_chart_locf.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_locf.png)\n\n\n### Interpolation - Linear Query\n\nSimilar to the LOCF interpolation procedure call, this will create a **LINEAR Interpolation** table.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LINEAR` Interpolate type.\n\n```sql\n/* INTERPOLATE PROCEDURE - LINEAR\nSimilar to the LOCF interpolation procedure call, this will create a Linear Interpolation table.\n\nCall Interpolate Procedure with Taglist, Start Time, End Time, and Intervals, with `LINEAR` Interpolate type.\n*/\nCALL HOL_TIMESERIES.ANALYTICS.PROCEDURE_TS_INTERPOLATE(\n    -- V_TAGLIST\n    '/IOT/SENSOR/TAG401',\n    -- V_FROM_TIME\n    '2024-01-01 12:10:00',\n    -- V_TO_TIME\n    '2024-01-01 13:10:00',\n    -- V_INTERVAL\n    10,\n    -- V_INTERP_TYPE\n    'LINEAR'\n);\n```\n\n##### CHART: Interpolation - Linear\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select `VALUE` and set the Aggregation to `Max`.\n\n**The chart will display a smoother LINEAR interpolated value between data points**.\n\n![assets/function_chart_linear.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_linear.png)\n\n\n### LTTB Query\n\nThe **Largest Triangle Three Buckets (LTTB)** algorithm is a time series downsampling algorithm that reduces the number of visual data points, whilst retaining the shape and variability of the time series data.\n\nStarting with a **RAW** query we can see the **LTTB** function in action, where the function will **downsample two hours of data for a one second tag**, 7200 data points downsampled to 500 data points whilst keeping the shape and variability of the values.\n\n**RAW Query**\n\n```sql\n/* RAW - 2 HOURS OF 1 SEC DATA\nSource of downsample - 7200 data points\n*/\nSELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC as VALUE\nFROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\nWHERE TIMESTAMP \u003E '2024-01-09 21:00:00'\nAND TIMESTAMP \u003C= '2024-01-09 23:00:00'\nAND TAGNAME = '/IOT/SENSOR/TAG301'\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n##### CHART: RAW Query\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select `VALUE` and set the Aggregation to `Max`.\n3. Under Data select `TIMESTAMP` and set the Bucketing to `Second`. \n\n**7200 Data Points**\n\n![assets/function_chart_lttb_raw.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_lttb_raw.png)\n\n**LTTB Query**\n\nWe can now pass the same data into the **LTTB table function** and request 500 data points to be returned.\n\n```sql\n/* LTTB - DOWNSAMPLE TO 500 DATA POINTS\nWe can now pass the same data into the LTTB table function and request 500 data points to be returned.\n\nThe DATA subquery sets up the data set, and this is cross joined with the LTTB table function,\nwith an input of TIMESTAMP, VALUE, and the downsample size of 500.\n*/\nSELECT DATA.TAGNAME, LTTB.TIMESTAMP::VARCHAR::TIMESTAMP_NTZ AS TIMESTAMP, LTTB.VALUE \nFROM (\n    SELECT TAGNAME, TIMESTAMP, VALUE_NUMERIC as VALUE\n    FROM HOL_TIMESERIES.ANALYTICS.TS_TAG_READINGS\n    WHERE TIMESTAMP \u003E '2024-01-09 21:00:00'\n    AND TIMESTAMP \u003C= '2024-01-09 23:00:00'\n    AND TAGNAME = '/IOT/SENSOR/TAG301'\n) AS DATA \nCROSS JOIN TABLE(HOL_TIMESERIES.ANALYTICS.FUNCTION_TS_LTTB(DATE_PART(EPOCH_NANOSECOND, DATA.TIMESTAMP), DATA.VALUE, 500) OVER (PARTITION BY DATA.TAGNAME ORDER BY DATA.TIMESTAMP)) AS LTTB\nORDER BY TAGNAME, TIMESTAMP;\n```\n\n##### CHART: LTTB Query\n\n1. Select the `Chart` sub tab below the worksheet.\n2. Under Data select `VALUE` and set the Aggregation to `Max`.\n3. Under Data select `TIMESTAMP` and set the Bucketing to `Second`. \n\n**500 Data Points - The shape and variability of the values are retained, when compared to the 7200 data point RAW chart**.\n\n![assets/function_chart_lttb_downsampled.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/function_chart_lttb_downsampled.png)\n\n\n\u003E \n\u003E \n\u003E You have now built your own **Time Series Analysis** functions and procedures, these can be called within applications working with time series data. We can now look at deploying a Time Series application.\n\u003E\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E This section runs through a **SQL Worksheet**, this can be run in Snowflake with a **Snowsight Worksheet**. Use the following steps to **Troubleshoot**.\n\u003E\n\u003E\n\u003E 1. Inside the `Lab Downloaded Files` folder open `worksheets/hol_timeseries_5_functions.sql` and **copy** the contents of the file.\n\u003E\n\u003E 2. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`.\n\u003E\n\u003E ![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\u003E\n\u003E 3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\u003E\n\u003E ![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\u003E\n\u003E 4. **Paste** the copied content into the newly created **Worksheet in Snowsight**.\n\u003E\n\u003E 5. **Run** all the commands in the worksheet.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Build Your Time Series Application in Streamlit\n\nAfter completing the analysis of the time series data that was streamed into Snowflake, we are now ready to **deliver a Time Series Analytics application** for end users to easily consume time series data. For this purpose we are going to use a **Streamlit in Snowflake** application, deployed using **Snowflake CLI**.\n\n![assets/streamlit_overview.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_overview.png)\n\n\u003E \n\u003E \n\u003E #### INFO: Streamlit\n\u003E **Streamlit** is an open-source Python library that makes it easy to **create web applications for machine learning, data analysis, and visualization**. **[Streamlit in Snowflake](https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit)** helps developers securely build, deploy, and share **Streamlit apps on Snowflake’s data cloud platform**, without moving data or application code to an external system.\n\u003E\n\u003E\n\u003E #### INFO: Snowflake CLI\n\u003E\n\u003E **[Snowflake CLI](https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/introduction/introduction)** is an open-source command-line tool designed for developers to **easily create, deploy, update, and view apps running on Snowflake**. We will use Snowflake CLI to deploy the **Time Series Streamlit application** to your Snowflake account.\n\u003E\n\n\n### Step 1 - Setup Snowflake Stage for Streamlit Application\n\n1. In **VS Code** open the worksheet `worksheets/hol_timeseries_7_streamlit.sql`\n\n2. Run the Worksheet to **create a stage for the Streamlit** application\n\n```sql\n/*##### STREAMLIT SCRIPT #####*/\n\n-- Set role, context, and warehouse\nUSE ROLE ROLE_HOL_TIMESERIES;\nUSE SCHEMA HOL_TIMESERIES.ANALYTICS;\nUSE WAREHOUSE HOL_ANALYTICS_WH;\n\n-- Create a stage for Streamlit\nCREATE OR REPLACE STAGE HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT\nDIRECTORY = (ENABLE = TRUE, REFRESH_ON_CREATE = TRUE)\nENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n\n/*###### EXTERNAL ACTIVITY #####\nUse Snowflake CLI to upload Streamlit app:\n$ conda activate hol-timeseries\n$ snow --config-file=\".snowflake/config.toml\" streamlit deploy --replace --project \"streamlit\" --connection=\"hol-timeseries-streamlit\"\n##############################*/\n\n/*##### STREAMLIT SCRIPT #####*/\n```\n\n\u003E \n\u003E \n\u003E There are **EXTERNAL ACTIVITY** sections in the worksheet, this will be covered in the next step.\n\u003E\n\n\u003E \n\u003E \n\u003E #### INFO: Pre-Built Streamlit Application\n\u003E\n\u003E A pre-built **Streamlit Application** has been provided as part of this lab. It is located in the `streamlit` **project** folder of the **GitHub Codespace VS Code** repository.\n\u003E\n\n### Step 2 - Deploy Streamlit Application to Snowflake\n\nIn this step, we will now deploy the Streamlit application on the Snowflake account using **Snowflake CLI**.\n\nIn the **GitHub Codespace VS Code**:\n\n1. Open `Menu \u003E Terminal \u003E New Terminal` - a new terminal window will now open\n\n![assets/labsetup_newterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png)\n\n2. Activate `hol-timeseries` python virtual environment by running `conda activate hol-timeseries`\n\n```bash\nconda activate hol-timeseries\n```\n\n![assets/labsetup_condaactivate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png)\n\n![assets/labsetup_condaactivated.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png)\n\n3. **Copy and run** the following Snowflake CLI command **into the Terminal** to deploy the Streamlit application\n\n```bash\nsnow --config-file=\".snowflake/config.toml\" streamlit deploy --replace --project \"streamlit\" --connection=\"hol-timeseries-streamlit\"\n```\n\n\u003E \n\u003E \n\u003E The **GitHub Codespace** may prompt to access the clipboard in **VSCode**, select **Allow** if prompted.\n\u003E\n\n![assets/streamlit_codespace_paste.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_codespace_paste.png)\n\n\u003E \n\u003E \n\u003E #### INFO: Streamlit Deploy with Snowflake CLI\n\u003E\n\u003E This command does the following:\n\u003E\n\u003E - **Deploys the Streamlit application** using the Snowflake account details mentioned in the \".snowflake/config.toml\" file\n\u003E - **--config-file** option provides the location of the config file that **contains Snowflake account details**\n\u003E - **--replace** option ensures that the **existing application, if present, is overwritten**\n\u003E - **--project** option provides the **path where the Streamlit app project resides**\n\u003E - **--connection** option dictates **which connection section from the \".snowflake/config.toml\"** file should be used for deployment\n\u003E\n\n\n### Step 3 - Launch the Streamlit Application\n\nOnce the Streamlit application is successfully deployed, Snowflake CLI will display the message **\"Streamlit successfully deployed and available\"** and will provide the URL for the Streamlit application.\n\n![assets/streamlit_launch.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_launch.png)\n\n1. Press **Command/Ctrl** and **click the URL** link to launch the Streamlit application in a new tab. Alternatively, copy and paste the URL into a new tab.\n\n2. Select `Open` once prompted.\n\n![assets/streamlit_open.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_open.png)\n\n\u003E \n\u003E \n\u003E #### INFO: Launch Streamlit Apps inside Snowflake\n\u003E\n\u003E You can also launch **Streamlit Applications** from inside Snowflake by going to `Projects \u003E Streamlit` and opening the `HOL_TIMESERIES_STREAMLIT` application.\n\u003E\n\u003E ![assets/streamlit_open_snowsight.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_open_snowsight.png)\n\u003E\n\n\n### Step 4 - Understanding the Streamlit Application\n\nThe **Streamlit in Snowflake** application contains several **pages**, accessible via the left menu, that cover various Time Series queries.\n\n#### Streamlit Pages\n\n* **Raw** Time Series Data\n* **Statistical Aggregate** Time Series Data\n* **Time Binning / Downsampling** Time Series Data\n\n![assets/streamlit_video_summary.gif](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_summary.gif)\n\n#### Filtering Menu\n\nEach page has a filtering menu to:\n* Select one or more tags\n* Change reporting time selection\n* Set the sample size of chart visualizations\n* Select various aggregations\n\n![assets/streamlit_video_menu.gif](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_menu.gif)\n\n#### Streamlit Features\n\nAt the bottom of each page there are options to:\n* **Select** how much data is displayed in the table along with the order\n* **Download as CSV** - To download the data in CSV file format\n* **Supporting Detail** - Shows the queries being run\n* **Refresh Mode** - Contains a toggle to enable auto refresh and see new data automatically\n\n![assets/streamlit_video_features.gif](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_video_features.gif)\n\n\n### Step 5 - Set Streamlit Filters and Query Data\n\n#### Initial IoT Data Loaded: 1-Jan-2024 to 14-Jan-2024\n\nThe initial data set **contains two weeks of data loaded for 1-Jan-2024 to 14-Jan-2024**. Let's query this using the Streamlit application.\n\nOpen the **Streamlit Application**:\n\n1. Select the **TS Raw** page\n\n2. From **Select Tag Name** choose the `/IOT/SENSOR/TAG101`\n\n3. For **Start Date** select `1-Jan-2024`\n\n4. For **Start Time** select `00:00`\n\n5. For **End Date** select `1-Jan-2024`\n\n6. For **End Time** select `04:00`\n\n![assets/streamlit_query_filter.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_filter.png)\n\n\u003E \n\u003E \n\u003E **Streamlit** will automatically refresh the page after making filter selections.\n\u003E\n\u003E Review the chart and table detail.\n\u003E\n\n**Data for 1-Jan-2024 should now display**\n\n![assets/streamlit_query_raw.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_raw.png)\n\n7. Select the **TS Aggregates** page\n\n    - The aggregates page will show high level statistical detail for the selected tag and time period.\n\n8. Select the **TS Binning** page\n\n    - The binning page shows a 1 minute downsampled average for the selected tag and time period.\n\n9. Try changing the **Select Aggregation Method** to `MIN` \n\n    - This will now show the 1 minute minimums for the tag and time period.\n\n10. Try changing the **Label Position** to `START`\n\n    - The **Tag Data** table will now show the **Start** timestamp for each minute interval.\n\n\u003E \n\u003E \n\u003E #### INFO: Tag Data Schema\n\u003E\n\u003E The **Tag Data detail tables** in the Streamlit Application have a **schema** that returns columns for **TAGNAME, TIMESTAMP, and VALUE**. This is to mimic an **API data contract** that will return a consistent schema structure of the data.\n\u003E\n\u003E If an **aggregation has been applied** to the Tag Data, the **TAGNAME will be updated** to reflect the aggregation and time interval of the data.\n\u003E\n\u003E ![assets/streamlit_tag_data.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_tag_data.png)\n\u003E\n\n\n### Step 6 - Start a Continuous Simulated Stream\n\nWe can now **start a continuous stream of data into Snowflake**, similar to the initial streaming load, to simulate IoT device **data streaming in near real-time** to Snowflake.\n\n![assets/model_streamingclient.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/model_streamingclient.png)\n\nIn the **GitHub Codespace VS Code**:\n\n1. Open `Menu \u003E Terminal \u003E New Terminal` - a new terminal window will now open\n\n![assets/labsetup_newterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png)\n\n2. Change directory into to the **iotstream** folder: `cd iotstream`\n\n```bash\ncd iotstream\n```\n\n3. Run the `Run_Slooow.sh` script to load the IoT data.\n\n```bash\n./Run_Slooow.sh\n```\n\n\u003E \n\u003E \n\u003E If there are no errors, IoT data will now be **streaming into Snowflake**, and the **Dynamic Tables** will start to update.\n\u003E\n\n4. Back **in the Streamlit application** try enabling `Auto Refresh` by `Expanding Refresh Mode \u003E Toggle Auto Refresh`\n\n    - The charts and data should now start to **automatically update with new data streaming into Snowflake every minute**.\n\n![assets/streamlit_refresh.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_refresh.png)\n\n5. Select the **TS Raw** page to see the raw data\n\n6. Try adding `/IOT/SENSOR/TAG401` and `/IOT/SENSOR/TAG601` to the **Select Tag Names** filter\n\n    - The charts and data should now contain two additional tags with the data updating every minute.\n\n![assets/streamlit_query_stream.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/streamlit_query_stream.png)\n\n\u003E \n\u003E \n\u003E You have now successfully deployed a **Time Series Application** using Streamlit in Snowflake. This will allow end users easy access to visualize time series data as well as run their own **Time Series Analysis** on all Time Series data available in Snowflake.\n\u003E\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E This section runs through **deploying a Streamlit application using Snowflake CLI in the GitHub Codespace**. Use the following steps to **Troubleshoot**.\n\u003E \n\u003E #### Confirm Snowflake CLI can Connect to Snowflake\n\u003E\n\u003E 1. Open `Menu \u003E Terminal \u003E New Terminal` - a new terminal window will now open.\n\u003E\n\u003E ![assets/labsetup_newterminal.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_newterminal.png)\n\u003E\n\u003E 2. Activate `hol-timeseries` python virtual environment by running `conda activate hol-timeseries`.\n\u003E\n\u003E ```bash\n\u003E conda activate hol-timeseries\n\u003E ```\n\u003E\n\u003E ![assets/labsetup_condaactivate.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivate.png)\n\u003E\n\u003E ![assets/labsetup_condaactivated.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/labsetup_condaactivated.png)\n\u003E\n\u003E 3. **Copy and run** the following Snowflake CLI command **into the Terminal** to deploy the Streamlit application.\n\u003E\n\u003E ```bash\n\u003E snow --config-file=\".snowflake/config.toml\" connection test --connection=\"hol-timeseries-streamlit\"\n\u003E ```\n\u003E   - You should receive an output with **Status \"OK\"**.\n\u003E\n\u003E ![assets/troubleshoot_snowflakecli_conntest.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_snowflakecli_conntest.png)\n\u003E\n\u003E 4. If the **Status is NOT \"OK\"**, review the error returned to Troubleshoot further.\n\u003E\n\u003E 5. Refer to the **\"Lab Setup\"** section and confirm configuration of `.snowflake/config.toml` file and **Snowflake user** `public key` setup.\n\u003E\n\u003E 6. Once **Snowflake CLI** is connected, re-run this section.\n\u003E\n\u003E #### Manually Deploy Streamlit Application using SQL\n\u003E\n\u003E 1. Review [Creating a Streamlit app by using SQL](https://docs.snowflake.com/en/developer-guide/streamlit/create-streamlit-sql).\n\u003E\n\u003E 2. **Login to Snowflake**, and select `+ Create \u003E SQL Worksheet` under the Snowflake logo at the top left.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_files_worksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_worksheet.png)\n\u003E \n\u003E 3. **Create a stage** using the `Lab Downloaded Files` worksheet `worksheets/hol_timeseries_7_streamlit.sql` SQL.\n\u003E\n\u003E ```sql\n\u003E -- Set role, context, and warehouse\n\u003E USE ROLE ROLE_HOL_TIMESERIES;\n\u003E USE SCHEMA HOL_TIMESERIES.ANALYTICS;\n\u003E USE WAREHOUSE HOL_ANALYTICS_WH;\n\u003E\n\u003E -- Create a stage for Streamlit\n\u003E CREATE OR REPLACE STAGE HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT\n\u003E DIRECTORY = (ENABLE = TRUE, REFRESH_ON_CREATE = TRUE)\n\u003E ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n\u003E ```\n\u003E\n\u003E 4. **Open the stage** by expanding `Data \u003E Databases \u003E HOL_TIMESERIES \u003E ANALYTICS \u003E Stages \u003E STAGE_TS_STREAMLIT`.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_stage.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_stage.png)\n\u003E\n\u003E 5. At the top right of the stage click the `+ Files` button.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_addfiles.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png)\n\u003E\n\u003E 6. In the **Upload Your Files** window, **Drag and Drop** the following files from `Lab Downloaded Files` under the `streamlit` folder, and set the `Specify the path` to **/HOL_TIMESERIES_STREAMLIT**, then click **Upload**.\n\u003E       - streamlit/1_TS_Home.py\n\u003E       - streamlit/environment.yml\n\u003E\n\u003E ![assets/troubleshoot_streamlit_files_home.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_home.png)\n\u003E \n\u003E 7. Click the `+ Files` button.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_addfiles.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png)\n\u003E\n\u003E 8. In the **Upload Your Files** window, **Drag and Drop** the following files from `Lab Downloaded Files` under the `streamlit/pages` folder, and set the `Specify the path` to **/HOL_TIMESERIES_STREAMLIT/pages**, then click **Upload**.\n\u003E       - streamlit/pages/2_TS_Raw.py\n\u003E       - streamlit/pages/3_TS_Aggregates.py\n\u003E       - streamlit/pages/4_TS_Binning.py\n\u003E       - streamlit/pages/8_TS_About.py\n\u003E\n\u003E ![assets/troubleshoot_streamlit_files_pages.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_pages.png)\n\u003E\n\u003E 9. Click the `+ Files` button.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_addfiles.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_addfiles.png)\n\u003E\n\u003E 10. In the **Upload Your Files** window, **Drag and Drop** the following files from `Lab Downloaded Files` under the `streamlit/common` folder, and set the `Specify the path` to **/HOL_TIMESERIES_STREAMLIT/streamlit/common**, then click **Upload**.\n\u003E       - streamlit/common/snowflake.png\n\u003E       - streamlit/common/snowflakelogo.png\n\u003E\n\u003E ![assets/troubleshoot_streamlit_files_common.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_common.png)\n\u003E\n\u003E 11. Under the Snowflake logo at the top left, select `+ Create \u003E SQL Worksheet`.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_files_worksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_files_worksheet.png)\n\u003E\n\u003E 12. **Run** the following SQL to create the Streamlit Application.\n\u003E\n\u003E ```sql\n\u003E -- Set role, context, and warehouse\n\u003E USE ROLE ROLE_HOL_TIMESERIES;\n\u003E USE SCHEMA HOL_TIMESERIES.ANALYTICS;\n\u003E USE WAREHOUSE HOL_ANALYTICS_WH;\n\u003E\n\u003E -- Create Stramlit Application\n\u003E CREATE OR REPLACE STREAMLIT HOL_TIMESERIES_STREAMLIT\n\u003E ROOT_LOCATION = '@HOL_TIMESERIES.ANALYTICS.STAGE_TS_STREAMLIT/HOL_TIMESERIES_STREAMLIT'\n\u003E MAIN_FILE = '/1_TS_Home.py'\n\u003E QUERY_WAREHOUSE = HOL_ANALYTICS_WH;\n\u003E ```\n\u003E\n\u003E 13. **Launch the Streamlit** application from `Projects \u003E Streamlit \u003E HOL_TIMESERIES_STREAMLIT`.\n\u003E\n\u003E ![assets/troubleshoot_streamlit_launch.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/troubleshoot_streamlit_launch.png)\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Cleanup\n\n1. In **VS Code** open the worksheet `worksheets/hol_timeseries_8_cleanup.sql`.\n\n2. Click the `Execute All Statements` button at the top right of the worksheet to **run the cleanup script**.\n\n![assets/cleanup_script_runall.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/cleanup_script_runall.png)\n\n```sql\n/*##### CLEANUP SCRIPT #####*/\n\n-- Set role and context\nUSE ROLE ACCOUNTADMIN;\nUSE DATABASE SNOWFLAKE;\n\n-- Cleanup Snowflake objects\nDROP DATABASE HOL_TIMESERIES;\nDROP WAREHOUSE HOL_TRANSFORM_WH;\nDROP WAREHOUSE HOL_ANALYTICS_WH;\nDROP ROLE ROLE_HOL_TIMESERIES;\nDROP USER USER_HOL_TIMESERIES;\n\n/*##### CLEANUP SCRIPT #####*/\n```\n\n2. Stop or delete the [Github Codespace](https://github.com/codespaces), using the Codespace actions menu.\n\n![assets/cleanup_codespace.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/cleanup_codespace.png)\n\n\u003E \n\u003E \n\u003E ### Troubleshooting\n\u003E\n\u003E This section runs through a **SQL Worksheet**, this can be run in Snowflake with a **Snowsight Worksheet**. Use the following steps to **Troubleshoot**.\n\u003E\n\u003E 1. Inside the `Lab Downloaded Files` folder open `worksheets/hol_timeseries_8_cleanup.sql` and **copy** the contents of the file.\n\u003E\n\u003E 2. **Login to Snowflake**, and from the menu expand `Projects \u003E Worksheets`.\n\u003E\n\u003E ![assets/analysis_worksheets.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_worksheets.png)\n\u003E\n\u003E 3. At the top right of the **Worksheets** screen, select `+ \u003E SQL Worksheet`. This will open a new worksheet in Snowsight.\n\u003E\n\u003E ![assets/analysis_newworksheet.png](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks/analysis_newworksheet.png)\n\u003E\n\u003E 4. **Paste** the copied content into the newly created **Worksheet in Snowsight**.\n\u003E\n\u003E 5. **Run** all the commands in the worksheet.\n\u003E\n\n\u003C!-- ------------------------ --\u003E\n## Conclusion and Resources\n\n\u003E \n\u003E \n\u003E ### Congratulations!\n\u003E\n\u003E You've successfully deployed an end-to-end **Time Series Analytics** solution with streaming data in Snowflake.\n\u003E\n\u003E #### We would greatly appreciate your feedback in our [Time series analytics survey](https://docs.google.com/forms/d/e/1FAIpQLSft8rz7OslJoZ4JZIUWMcNjdD45FwKZH5BGNRGY1n5kNIu1dg/viewform)\n\u003E\n\n\n### What You Learned\n\n- How to **stream time series data** into Snowflake using Snowpipe Streaming\n- How to **use Dynamic Tables** for continuous data pipeline transformations\n- How to **analyze time series data** using native Snowflake time series functions\n- How to **create custom time series functions** and procedure in Snowflake\n- How to **deploy a Streamlit application using Snowflake CLI** to enable end users to run time series analytics\n\n\n### Additional Resources\n\n#### Snowflake Documentation\n- [Analyzing time-series data](https://docs.snowflake.com/en/user-guide/querying-time-series-data)\n- [Time-Series Forecasting (Snowflake Cortex ML Functions)](https://docs.snowflake.com/en/user-guide/snowflake-cortex/ml-functions/forecasting)\n- [Snowpark Developer Guide for Python](https://docs.snowflake.com/en/developer-guide/snowpark/python/index)\n- [Streamlit in Snowflake](https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit)\n- [Snowpipe Streaming](https://docs.snowflake.com/en/user-guide/data-load-snowpipe-streaming-overview)\n- [Overview of the Kafka connector](https://docs.snowflake.com/en/user-guide/kafka-connector-overview)\n- [Using Snowflake Connector for Kafka with Snowpipe Streaming](https://docs.snowflake.com/user-guide/data-load-snowpipe-streaming-kafka)\n\n\n#### Snowflake Blog\n- [Accelerate Your Time Series Analytics with Snowflake’s ASOF JOIN, Now Generally Available](/blog/time-series-analytics-asof-join-generally-available/)\n- [Snowflake Blog](/blog/)\n\n\n#### Snowflake Community\n- [Join the Snowflake Community](https://community.snowflake.com/)\n\n\n#### Snowflake Training and Certification\n- [Training Courses and Certifications](https://learn.snowflake.com/)\n","multiValue":false,":type":"text/x-markdown"},"quickstartArticleLogoImage":{"dataType":"string","title":"Quickstart Article Logo Image","multiValue":false,":type":"text/plain"}},"elementsOrder":["quickstartArticleBody","quickstartArticleLogoImage"],"model":"snowflake-site/models/quickstart-article"},"flexible_column_cont":{"id":"flexible-column-container-bed9044f8b","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-39a09c16da",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-bb2a7eb2c2","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2025-12-20",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-e20283f91b","additionalClasses":"qs-disclaimer-text","text":"\u003Cp\u003E\u003Cspan style=\"color: #666;\"\u003EThis content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances\u003C/span\u003E\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}},":itemsOrder":["quickstart_last_modi","text"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-39de7ee108",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{},":itemsOrder":[]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["contentfragment","flexible_column_cont"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-0bedf05232",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-61da06c0f1","isDeveloperGuidesPage":false,":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container",":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-710c2cdcf4","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003ELab Setup\u003C/h2\u003E","\u003Ch2\u003ESetup Snowflake Resources\u003C/h2\u003E","\u003Ch2\u003ESnowpipe Streaming Ingestion\u003C/h2\u003E","\u003Ch2\u003EData Modeling and Transformation\u003C/h2\u003E","\u003Ch2\u003ETime Series Analysis\u003C/h2\u003E","\u003Ch2\u003EBuild Your Own Time Series Functions\u003C/h2\u003E","\u003Ch2\u003EBuild Your Time Series Application in Streamlit\u003C/h2\u003E","\u003Ch2\u003ECleanup\u003C/h2\u003E","\u003Ch2\u003EConclusion and Resources\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-cca1152421","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks",":type":"snowflake-site/components/quickstart/quickstart-button","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}},":itemsOrder":["quickstart_table_of_","quickstart_button"]}},":itemsOrder":["quickstart_table_of_"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-25a2f3a6f3","title":"Page CSS","cssContent":"#quickstart-template-main-flexible-container{padding:24px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:1fr 0}.qs-disclaimer-text p \u003E span{font-size:15px !important}@media (min-width:768px){#quickstart-template-main-flexible-container{padding:24px 32px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:48px}}@media (max-width:767px){#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:0}}@media (min-width:1024px){#quickstart-template-main-flexible-container{padding:0 92px 48px 92px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:117px}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["quickstart_hero","flexible_column_cont","markup_editor"],":type":"wcm/foundation/components/responsivegrid"},"modal_container":{"layout":"SIMPLE","id":"container-0eea27f08f",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-c969d84918","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-8f03e778c5",":type":"snowflake-site/components/container",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-2e3d6944df",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-66534d6bad","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"medium","bottomPadding":"extra-small","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"sf-footer-grid","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-72d3ee5da9",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-34eb6723d9",":type":"snowflake-site/components/container",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-847626919c",":type":"snowflake-site/components/container",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-27b1c2e79a",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-baa318f703","additionalClasses":"sf-footer__newsletter-title","text":"\u003Cp\u003E\u003Cb\u003ESubscribe to our monthly newsletter\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EStay up to date on Snowflake’s latest products, expert insights and resources—right in your inbox!\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-regular text-color-text-04"},"marketo_v2":{"id":"marketo-v2-72e323481f","marketoForm":{"formId":"45871","edit":false,"successUrl":null,"hidden":null,"script":null,"values":null},"marketoConfigured":true,"formConfigured":true,"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com",":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container":{"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-3a810ea39e",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-111450ec7e","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003EProduct\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/platform/\"\u003EPlatform\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/product/snowflake-cowork/\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/data-engineering/\"\u003EData Engineering\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/analytics/\"\u003EAnalytics\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/ai/\"\u003EAI\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/applications-and-collaboration/\"\u003EApplications &amp; Collaboration\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/pricing-options/\"\u003EPricing\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"text_copy":{"id":"text-5d177878e3","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ESupport\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/support/\"\u003ESupport\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/addenda/priority-support-services-description/\"\u003EPriority Support\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://status.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EStatus\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text","text_copy"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium"},"container_copy_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-5eeb1f781c",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-23bc9bf685","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E\u003Ca href=\"/en/solutions/industries/\"\u003EIndustries\u003C/a\u003E\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/advertising-media-entertainment/\"\u003EAdvertising, Media &amp; Entertainment\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/financial-services/\"\u003EFinancial Services\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/healthcare-and-life-sciences/\"\u003EHealthcare &amp; Life Sciences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/manufacturing/\"\u003EManufacturing\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/public-sector/\"\u003EPublic Sector\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/retail-consumer-goods/\"\u003ERetail &amp; Consumer Goods\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/telecom/\"\u003ETelecom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/solutions/industries/technology/\"\u003ETechnology\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-96b7bca398",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-02b5f42e1f","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ECompany\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/about-snowflake/\"\u003EAbout Snowflake\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/leadership-and-board/\"\u003ELeadership &amp; Board\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://careers.snowflake.com/us/en\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ECareers\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://investors.snowflake.com/overview/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EInvestor Relations\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://trust.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ETrust Center\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/brand-guidelines/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EBrand Guidelines\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/contact/\"\u003EContact\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/news/\"\u003ENewsroom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/esg/\"\u003EEnvironmental, Social &amp; Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/snowflake-ventures/\"\u003ESnowflake Ventures\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/end-data-disparity/\"\u003EEnd Data Disparity\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/summit/\"\u003ESnowflake Summit 26\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy_copy_":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-cef8f0575a",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-bedeaac410","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ELearn\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/resources/\"\u003EResource Library\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/webinars/demo/\"\u003ELive Demos\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/fundamentals/\"\u003EFundamentals\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/training/\"\u003ETraining\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/certifications/\"\u003ECertifications\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://learn.snowflake.com/en/\"\u003ESnowflake University\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/developers/guides\"\u003EDeveloper Guides\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://docs.snowflake.com/\"\u003EDocumentation\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/data-governance/\"\u003EData Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8c0ed93cd0",":type":"snowflake-site/components/container",":items":{"container_112062425":{"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-e0848d2b0c",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-8c2afc4117","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-2fb5d2ed95",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-08da5080e5",":type":"snowflake-site/components/container",":items":{"container":{"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-03a6581319",":type":"snowflake-site/components/container",":items":{"image":{"id":"image-e08e660e74","additionalClasses":"sf-footer__logo","lazyEnabled":true,"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg","alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"height":"64","width":"64",":type":"snowflake-site/components/image"}},":itemsOrder":["image"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"text_copy_copy_16360":{"id":"text-1e95b06e6e","additionalClasses":"sf-footer__legal-links","text":"\u003Cul\u003E\r\n\u003Cli\u003E© 2026 Snowflake Inc. All Rights Reserved\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/\"\u003EPrivacy Policy\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/legal/snowflake-site-terms/\"\u003ESite Terms\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://info.snowflake.com/Preference-center.html\"\u003ECommunication Preferences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Cbutton id=\"ot-sdk-btn\" class=\"ot-sdk-show-settings\"\u003ECookie Settings\u003C/button\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/#12\"\u003EDo Not Share My Personal Information\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/\"\u003ELegal\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"markup_editor":{"id":"markup-editor-2ecab9cb14","title":" ","htmlContent":"\u003Cdiv class=\"sf-footer__social\"\u003E\r\n\u003Cdiv data-testid=\"snowflake-footer-twitter\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://x.com/Snowflake\" data-testid=\"button-external\" aria-label=\"X (Twitter)\" role=\"button\" class=\"snowflake-button-container\" title=\"X (Twitter)\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 59 53\" class=\"button-icon\"\u003E\u003Cpath fill=\"currentColor\" d=\"M46.614 0h9.044L35.8 22.49 59 53H40.795L26.54 34.46 10.223 53H1.18l21.036-24.055L0 0h18.657l12.878 16.937zM43.45 47.72h5.013L16.023 5.085h-5.387z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-linkedin\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.linkedin.com/company/3653845\" data-testid=\"button-external\" aria-label=\"LinkedIn\" role=\"button\" class=\"snowflake-button-container\" title=\"LinkedIn\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M22.223 0H1.772C.792 0 0 .773 0 1.73v20.536C0 23.222.792 24 1.772 24h20.451c.98 0 1.777-.778 1.777-1.73V1.73C24 .773 23.203 0 22.223 0ZM7.12 20.452H3.558V8.995H7.12v11.457ZM5.34 7.434a2.064 2.064 0 1 1 0-4.125 2.063 2.063 0 0 1 0 4.125Zm15.112 13.018h-3.558v-5.57c0-1.326-.024-3.037-1.852-3.037-1.851 0-2.133 1.449-2.133 2.944v5.663H9.356V8.995h3.413v1.566h.047c.473-.9 1.636-1.852 3.365-1.852 3.605 0 4.27 2.372 4.27 5.457v6.286Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-facebook\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.facebook.com/snowflakedb/\" data-testid=\"button-external\" aria-label=\"Facebook\" role=\"button\" class=\"snowflake-button-container\" title=\"Facebook\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.875V12h3.328l-.532 3.469h-2.796v8.385C19.612 22.954 24 17.99 24 12Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-youtube\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.youtube.com/user/snowflakecomputing\" data-testid=\"button-external\" aria-label=\"YouTube\" role=\"button\" class=\"snowflake-button-container\" title=\"YouTube\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M23.76 7.2s-.233-1.655-.955-2.381c-.914-.956-1.936-.961-2.405-1.017-3.356-.244-8.395-.244-8.395-.244h-.01s-5.039 0-8.395.244c-.469.056-1.49.06-2.405 1.017C.473 5.545.244 7.2.244 7.2S0 9.145 0 11.086v1.819c0 1.94.24 3.886.24 3.886s.233 1.654.95 2.38c.915.957 2.115.924 2.65 1.027 1.92.183 8.16.24 8.16.24s5.044-.01 8.4-.249c.469-.056 1.49-.06 2.405-1.017.722-.727.956-2.381.956-2.381S24 14.85 24 12.905v-1.819c0-1.94-.24-3.886-.24-3.886ZM9.52 15.113V8.367l6.483 3.385-6.483 3.36Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\r\n\u003C/div\u003E","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container","text_copy_copy_16360","markup_editor"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_112062425"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"},"markup_editor_copy":{"id":"markup-editor-db5ba53391","title":"New css","cssContent":".snowflake-image-container img{background-color:transparent}div.snowflake-person-chip-avatar{width:80px !important}#snowflake-blog-template-main-container .snowflake-quote-item-card{margin-top:40px}#snowflake-blog-template-main-container .aem-GridColumn:has(.vertical-video){background-color:#000;border-radius:16px;overflow:hidden}#snowflake-blog-template-main-container .is-vertical img{max-width:400px;margin-left:auto;margin-right:auto}#snowflake-blog-template-main-container .vertical-video{max-width:240px;margin-left:auto;margin-right:auto}@media screen and (min-width:1367px){.dynamic .heading-1-v2 .snowflake-title-v2-line{font-size:72px !important;line-height:60px !important}}.snowflake-flexible-column-container-items-alignment-match-height .download-card,.snowflake-flexible-column-container-items-alignment-match-height .download-card\u003E.container{height:100%}.download-card div.code-toolbar\u003E.toolbar .copy-to-clipboard-button{background-color:white;border:1px solid #a9e1f6;margin-right:4px;top:6px;border-radius:16px;height:26px;width:40px}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:before{content:'';background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23249EDC;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23249EDC;'%3E%3C/path%3E%3C/svg%3E\");background-size:auto 65%;background-position:center;background-repeat:no-repeat;top:0;left:0;width:100%;height:100%}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:hover:before{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23fff;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23fff;'%3E%3C/path%3E%3C/svg%3E\")}.download-card\u003Ediv{background-color:#fff;border:1px solid #ccc;border-radius:8px;padding:24px}.download-chip__headline{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:16px}.download-chip{padding:8px 12px !important;border-radius:4px;transition:300ms ease background-color}.download-chip .black-blue-text-color .snowflake-title-v2-line{color:#000 !important;padding-right:24px;font-family:'Lato',sans-serif;font-size:14px !important;font-weight:500 !important}.download-chip .black-blue-text-color .snowflake-title-v2-line:not(:first-child){opacity:.6;font-style:italic !important}.download-chip .snowflake-content-chip-button{display:none}.download-chip.is-external-link{background-size:16px 16px;background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.06055 13.0607L11.8605 2.26067M13.0605 10.6607V1.06067H3.46055' stroke='%23249EDC' stroke-width='2.12132' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-chip{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_883_7979)'%3E%3Cpath d='M3.375 16.875H14.625' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9 1.125V11.25' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4.5 7.875L9 12.375L13.5 7.875' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_883_7979'%3E%3Crect width='18' height='18' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\");background-size:24px auto;background-repeat:no-repeat;background-position:calc(100% - 12px) center}.download-chip__headline{display:flex;gap:16px;flex-direction:row !important;flex-wrap:nowrap}.download-chip__headline::before{content:'';display:inline-block;width:24px;height:24px;background-position:center;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='21' viewBox='0 0 21 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 9.89999C8.13657 9.89999 8.74702 9.64713 9.19711 9.19704C9.64719 8.74696 9.90005 8.13651 9.90005 7.49999V2.69999C9.90005 2.06347 9.64719 1.45302 9.19711 1.00293C8.74702 .552844 8.13657 .299988 7.50005 .299988H2.70005C2.06353 .299988 1.45308 .552844 1.00299 1.00293C.552905 1.45302 .300049 2.06347 .300049 2.69999V7.49999C.300049 8.13651 .552905 8.74696 1.00299 9.19704C1.45308 9.64713 2.06353 9.89999 2.70005 9.89999H7.50005ZM7.50005 7.49999H2.70005V2.69999H7.50005V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 20.3C8.13657 20.3 8.74702 20.0472 9.19711 19.5971C9.64719 19.147 9.90005 18.5365 9.90005 17.9V13.1C9.90005 12.4635 9.64719 11.853 9.19711 11.403C8.74702 10.9529 8.13657 10.7 7.50005 10.7H2.70005C2.06353 10.7 1.45308 10.9529 1.00299 11.403C.552905 11.853 .300049 12.4635 .300049 13.1V17.9C.300049 18.5365 .552905 19.147 1.00299 19.5971C1.45308 20.0472 2.06353 20.3 2.70005 20.3H7.50005ZM7.50005 17.9H2.70005V13.1H7.50005V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 9.89999C18.5366 9.89999 19.147 9.64713 19.5971 9.19704C20.0472 8.74696 20.3001 8.13651 20.3001 7.49999V2.69999C20.3001 2.06347 20.0472 1.45302 19.5971 1.00293C19.147 .552844 18.5366 .299988 17.9001 .299988H13.1001C12.4636 .299988 11.8531 .552844 11.403 1.00293C10.9529 1.45302 10.7001 2.06347 10.7001 2.69999V7.49999C10.7001 8.13651 10.9529 8.74696 11.403 9.19704C11.8531 9.64713 12.4636 9.89999 13.1001 9.89999H17.9001ZM17.9001 7.49999H13.1001V2.69999H17.9001V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 20.3C18.5366 20.3 19.147 20.0472 19.5971 19.5971C20.0472 19.147 20.3001 18.5365 20.3001 17.9V13.1C20.3001 12.4635 20.0472 11.853 19.5971 11.403C19.147 10.9529 18.5366 10.7 17.9001 10.7H13.1001C12.4636 10.7 11.8531 10.9529 11.403 11.403C10.9529 11.853 10.7001 12.4635 10.7001 13.1V17.9C10.7001 18.5365 10.9529 19.147 11.403 19.5971C11.8531 20.0472 12.4636 20.3 13.1001 20.3H17.9001ZM17.9001 17.9H13.1001V13.1H17.9001V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat}.download-chip__headline.is-cli::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 17L10 11L4 5' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 19H20' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-card pre[class*=language-]{padding:8px 12px;background-color:var(--ui-background-05);overflow:hidden}.download-chip__headline.is-windows,.download-chip__headline.is-mac{gap:12px}.download-chip__headline.is-windows::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='4875' height='4875' viewBox='0 0 4875 4875' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_122_201)'%3E%3Cpath d='M0 0H2311V2310H0V0ZM2564 0H4875V2310H2564V0ZM0 2564H2311V4875H0V2564ZM2564 2564H4875V4875H2564' fill='%23000'/%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-mac::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns:x='ns_extend;' xmlns:i='ns_ai;' xmlns:graph='ns_graphs;' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' viewBox='0 0 41.5 51' style='enable-background:new 0 0 41.5 51;' xml:space='preserve'%3E%3Cmetadata%3E%3Csfw xmlns='ns_sfw;'%3E%3Cslices%3E%3C/slices%3E%3CsliceSourceBounds bottomLeftOrigin='true' height='51' width='41.5' x='166.1' y='-208.1'%3E%3C/sliceSourceBounds%3E%3C/sfw%3E%3C/metadata%3E%3Cg%3E%3Cpath d='M40.2,17.4c-3.4,2.1-5.5,5.7-5.5,9.7c0,4.5,2.7,8.6,6.8,10.3c-.8,2.6-2,5-3.5,7.2c-2.2,3.1-4.5,6.3-7.9,6.3s-4.4-2-8.4-2 c-3.9,0-5.3,2.1-8.5,2.1s-5.4-2.9-7.9-6.5C2,39.5,.1,33.7,0,27.6c0-9.9,6.4-15.2,12.8-15.2c3.4,0,6.2,2.2,8.3,2.2 c2,0,5.2-2.3,9-2.3C34.1,12.2,37.9,14.1,40.2,17.4z M28.3,8.1C30,6.1,30.9,3.6,31,1c0-.3,0-.7-.1-1c-2.9,.3-5.6,1.7-7.5,3.9 c-1.7,1.9-2.7,4.3-2.8,6.9c0,.3,0,.6,.1,.9c.2,0,.5,.1,.7,.1C24.1,11.6,26.6,10.2,28.3,8.1z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-desktop::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='.8'%3E%3Cpath d='M1.5 21H22.5V18H1.5V21Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19.5 15C20.2956 15 21.0587 14.6839 21.6213 14.1213C22.1839 13.5587 22.5 12.7956 22.5 12V6C22.5 5.20435 22.1839 4.44129 21.6213 3.87868C21.0587 3.31607 20.2956 3 19.5 3H4.5C3.70435 3 2.94129 3.31607 2.37868 3.87868C1.81607 4.44129 1.5 5.20435 1.5 6V12C1.5 12.7956 1.81607 13.5587 2.37868 14.1213C2.94129 14.6839 3.70435 15 4.5 15H19.5ZM19.5 12H4.5V6H19.5V12Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3C/g%3E%3C/svg%3E%0A\")}.download-card .snowflake-code-snippet,.download-card .snowflake-code-snippet code,.download-card .snowflake-code-snippet pre{font-size:14px;color:#000;text-shadow:none !important}.download-chip:hover{background-color:var(--ui-background-05) !important;transition:300ms ease background-color}body:has(.snowflake-skip-to-content[style]) #subNav,.pushdown-banner-dismissed #subNav{top:var(--scroll-padding-top) !important;transition:300ms ease top}body:has(.snowflake-skip-to-content[style*=\"58\"]) #subNav{top:34px !important}body:has(.snowflake-skip-to-content[style*=\"82\"]) #subNav{top:58px !important}body:has(.snowflake-skip-to-content[style*=\"130\"]) #subNav{top:106px !important}body:has(.snowflake-skip-to-content[style*=\"138\"]) #subNav{top:114px !important}body:has(.snowflake-skip-to-content[style*=\"146\"]) #subNav{top:122px !important}.is-hidden .snowflake-person-chip-avatar{display:none}.is-small .snowflake-person-chip-avatar{width:56px;height:56px}.ai-summary ul{margin:16px 0 0 0 !important;padding:0 !important;list-style-type:none}.ai-summary li{margin:0;padding:0 0 0 32px;position:relative}.ai-summary li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.ai-summary li:not(:last-child){margin-bottom:1rem}.snowflake-content-chip-image__image{aspect-ratio:5 / 3 !important}.content-chip-new .snowflake-content-chip-image__image{height:100% !important;aspect-ratio:unset !important}.snapshot-card .snowflake-text p:not(:first-child){margin-top:var(--spacing-01)}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p:has(b){font-family:'Texta',sans-serif;margin-top:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p b{font-weight:700 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){border-bottom:1px solid #ccc;padding-bottom:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) p:first-child:has(b){font-family:'Texta',sans-serif;font-size:20px !important;margin-bottom:1rem !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li{display:inline-block}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li a{display:inline-block;text-decoration:none;padding:4px 16px !important;border:1px solid #ccc;border-radius:24px;color:#666 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) ul{list-style-type:none;display:flex;padding:0 !important;margin:0 !important;gap:12px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container img{width:90%;max-width:240px;margin:0 auto}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container{padding:40px;max-width:450px;margin:0 0 0 auto;background-color:#fff;box-shadow:0 2px 6px 0 rgba(152,162,179,.25),0 10px 20px 0 rgba(152,162,179,.10);border-radius:8px;border-top:4px solid var(--ui-01)}.ai-summary{background-color:#f3fbfe;border-left:2px solid var(--ui-01);padding:40px}.ai-summary\u003Espan p:last-child:has(i){color:#666;font-size:14px !important}.ai-summary\u003Espan p:last-child:has(i) a{color:#666 !important;text-decoration:underline !important}.ai-summary\u003Espan p:last-child:has(i) a:hover{color:var(--ui-01) !Important}.ai-summary\u003Espan p:first-child:has(b)::after{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.3158 3.15226C8.6475 6.2258 6.22698 8.64545 3.15232 9.31587C2.94923 9.36072 2.94923 9.63928 3.15232 9.68413C6.22698 10.3522 8.6475 12.7742 9.3158 15.8477C9.36067 16.0508 9.63933 16.0508 9.6842 15.8477C10.3525 12.7742 12.773 10.3545 15.8477 9.68413C16.0508 9.63928 16.0508 9.36072 15.8477 9.31587C12.773 8.64781 10.3525 6.2258 9.6842 3.15226C9.63933 2.94925 9.36067 2.94925 9.3158 3.15226Z' fill='%23249EDC'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.3725 11.5461C16.9098 13.6739 15.2341 15.3491 13.1054 15.8132C12.9649 15.8443 12.9649 16.0371 13.1054 16.0681C15.2341 16.5307 16.9098 18.2074 17.3725 20.3353C17.4035 20.4758 17.5965 20.4758 17.6275 20.3353C18.0902 18.2074 19.7659 16.5323 21.8946 16.0681C22.0352 16.0371 22.0352 15.8443 21.8946 15.8132C19.7659 15.3507 18.0902 13.6739 17.6275 11.5461C17.5965 11.4055 17.4035 11.4055 17.3725 11.5461Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-repeat:no-repeat;background-size:contain;background-position:center;vertical-align:middle;margin-left:8px}.ai-summary\u003Espan p:first-child:has(b){color:var(--ui-01) !important;text-transform:uppercase}.border-top{border-top:1px solid rgba(0,0,0,.2)}.border-top\u003Espan{display:block;padding-top:32px}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9 !important}.content-chip-new .snowflake-content-chip-image__image{border-radius:0;object-fit:cover;height:100%}.sf-footer #ot-sdk-btn.ot-sdk-show-settings,.sf-footer #ot-sdk-btn.optanon-show-settings{color:rgba(255,255,255,.7) !important;text-underline-offset:4px;border-top:none;border-left:none;border-right:none;border-bottom:1px dotted transparent;background-color:transparent !important;background-image:none !important;transition:300ms ease text-decoration-color;padding:0 !important;font-size:12px;font-family:'Lato',sans-serif}.sf-footer #ot-sdk-btn.ot-sdk-show-settings:hover,.sf-footer #ot-sdk-btn.optanon-show-settings:hover{color:rgba(255,255,255,1) !important;border-bottom:1px dotted var(--ui-01);transition:300ms ease text-decoration-color}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{flex-shrink:0}.sf-footer__disclaimers{background-color:#042130}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p a{color:inherit;text-decoration:none !important}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p sup{margin-right:2px}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p{text-indent:-5px;padding-left:5px}.sf-footer__disclaimers-inner{border-top:1px solid rgba(255,255,255,.25);padding:40px 0}.sf-footer__disclaimers .snowflake-simple-stat{align-items:flex-start;text-align:left;color:rgba(255,255,255,.7);margin-bottom:10px}.sf-footer__social{display:flex;justify-content:center;gap:12px}.sf-footer .snowflake-footer-social-item{margin:0 !important}.sf-footer .snowflake-footer-social-item a{line-height:0;background-color:rgba(3,24,35,.8);display:inline-block;width:48px !important;height:48px;border-radius:8px;display:inline-flex;justify-content:center;align-items:center;transition:300ms ease background-color}.sf-footer .snowflake-footer-social-item a:hover{background-color:var(--ui-01) !important;transition:300ms ease background-color}.sf-footer__bottom{padding-bottom:40px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoError .mktoErrorMsg{max-width:100%;color:#fff}.sf-footer .mktoForm .mktoError .mktoErrorMsg .mktoErrorDetail{display:inline-block}.sf-footer .mktoFormRow:has(.mktoHtmlText:empty){display:none}.sf-footer .mktoFormRow .mktoHtmlText span{color:#fff !important}.sf-footer{background-color:#042130}.sf-footer .optanon-toggle-display:hover{text-decoration-color:var(--ui-01) !important;cursor:pointer !important;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:var(--ui-01);color:#fff !important;transition:300ms ease text-decoration-color;text-decoration:underline;opacity:1}.sf-footer__logo{width:40px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{row-gap:32px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;align-items:center;text-align:center;row-gap:16px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){text-align:center;flex-grow:1}.sf-footer__legal-links li button,.sf-footer__legal-links li a,.sf-footer__legal-links li{margin:0;color:rgba(255,255,255,.7) !important;font-weight:500}.sf-footer__legal-links li a:hover{color:rgba(255,255,255,1) !important}.sf-footer div.sf-footer__copyright p,.sf-footer div.sf-footer__legal-links li,.sf-footer div.sf-footer__legal-links a,.sf-footer div.sf-footer__legal-links p{font-size:12px !important}.sf-footer__legal-links ul{list-style-type:none;margin:0;padding:0;display:flex;gap:20px;row-gap:4px;justify-content:center;flex-wrap:wrap;text-align:center}.sf-footer__legal-links li:last-child{width:100%}.sf-footer .mktoFormRow:has(.mktoPlaceholder),.sf-footer .mktoFormRow:has(input[type=\"hidden\"]){display:none !important}.sf-footer .mktoFormCol{margin-bottom:0 !important}.sf-footer label[for=\"adhoc1\"]{width:auto !important;flex-grow:1;margin-left:16px}.sf-footer .mktoFieldWrap:has(label[for=\"adhoc1\"]){display:flex;flex-direction:row-reverse;margin-top:22px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoCheckboxList input[type=checkbox]{background-color:transparent !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-color:transparent !important;color:#fff !important;height:auto !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important;padding:12px 18px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select:focus{border-color:var(--ui-01) !important}.sf-footer .mktoForm *{padding:0 !important}.sf-footer .mktoForm,.sf-footer .snowflake-marketo-form-container{padding:0 !important;background:transparent;margin-bottom:0;box-shadow:none}.sf-footer .mktoHtmlText.mktoHasWidth{width:100% !important;margin:24px 0}.sf-footer .mktoFormRow{flex-direction:column}.sf-footer .mktoForm .mktoButtonWrap{margin:0 !important}.sf-footer select{background-image:url(\"data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.981445 1.43496L6.90897 7.32496L12.9314 1.33496' stroke='white' stroke-width='1.33333' stroke-miterlimit='10' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\") !important}.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative{justify-content:flex-start}.sf-footer *::placeholder{color:#fff !important;opacity:.8}.sf-footer .mktoForm .mktoButtonWrap.mktoSimple .mktoButton{background-color:var(--ui-01) !important;color:#fff !important;width:100% !important;padding:12px 16px !important;border:1px solid var(--ui-01) !important;background-image:none !important;border-radius:48px;text-transform:uppercase;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:16px !important;line-height:1.2}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoHtmlText\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoLabel\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap label.mktoLabel{color:#fff !important}.sf-footer__newsletter-title p:not(:first-child){margin-top:8px !important}.sf-footer__newsletter-title p b{font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:22px !important;line-height:1.2}.sf-footer__newsletter-title p:last-child{font-size:14px !important;opacity:.8}.sf-footer__link-group li a[target=\"_blank\"]::after{content:'';display:inline-block;width:10px;height:10px;margin-left:5px;background-image:url(\"data:image/svg+xml,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.72222 1.22222C6.38471 1.22222 6.11111 .948616 6.11111 .611111C6.11111 .273607 6.38471 0 6.72222 0H10.3889C10.551 0 10.7064 .0643867 10.821 .178988C10.9356 .293596 11 .449032 11 .611111V4.27778C11 4.61529 10.7264 4.88889 10.3889 4.88889C10.0514 4.88889 9.77778 4.61529 9.77778 4.27778V2.08647L4.09879 7.76545C3.86013 8.00409 3.4732 8.00409 3.23454 7.76545C2.99589 7.52681 2.99589 7.13986 3.23454 6.90122L8.91355 1.22222H6.72222ZM0 2.44444C0 1.76943 .547207 1.22222 1.22222 1.22222H4.27778C4.61529 1.22222 4.88889 1.49583 4.88889 1.83333C4.88889 2.17084 4.61529 2.44444 4.27778 2.44444H1.22222V9.77778H8.55556V6.72222C8.55556 6.38471 8.82915 6.11111 9.16667 6.11111C9.50418 6.11111 9.77778 6.38471 9.77778 6.72222V9.77778C9.77778 10.4528 9.23059 11 8.55556 11H1.22222C.547207 11 0 10.4528 0 9.77778V2.44444Z' fill='white'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-position:center}.sf-footer__link-group ul,.sf-footer__link-group li{margin:0;padding:0;list-style-type:none}.sf-footer__link-group ul{margin-top:20px !important}.sf-footer__link-group li{margin-top:15px}.sf-footer div.sf-footer__link-group\u003Espan\u003Ep\u003Ea,.sf-footer div.sf-footer__link-group\u003Espan\u003Ep{color:var(--ui-01) !important;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:20px !important;line-height:1.2}.sf-footer__link-group li a{opacity:.9;color:#fff !important;font-weight:500 !important;font-size:15px !important;line-height:1.3}.sf-footer__link-group li a:hover{opacity:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::before,.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::after{display:none}.sf-footer__column{flex-grow:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child){width:50%}@media (min-width:800px){.sf-footer__legal-links ul{justify-content:flex-start;text-align:left}.sf-footer__social{justify-content:flex-end}.sf-footer__legal-links ul{padding-left:24px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{text-align:right;flex-wrap:nowrap}.sf-footer__legal-links.align-left ul{justify-content:flex-start}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;flex-direction:row}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto !important;max-width:200px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;order:2;width:100% !important;max-width:none}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto}}@media screen and (min-width:1380px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{flex-wrap:nowrap}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{padding-right:48px;max-width:380px;background-color:rgba(3,24,35,.4);padding:32px;margin-left:48px;border-radius:16px}.sf-footer__link-group li,.sf-footer__link-group li a{font-size:14px !important;line-height:1.3}}@media screen and (max-width:991px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{order:2;margin-top:24px !important}}@media screen and (max-width:420px){.is-reduced-mobile .heading-1-v2,.is-reduced-mobile .heading-1-v2-sm{font-size:32px;line-height:28px}}.quote-content-chip{background-color:var(--ui-background-05);padding:24px;border-radius:12px;position:relative}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan{color:rgba(0,0,0,.8) !important;font-size:15px !important;line-height:1.5 !important;font-family:'Lato',sans-serif;font-weight:400 !important}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:not(:first-child){max-width:calc(100% - 200px)}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:nth-child(2){font-family:'Texta',sans-serif;color:#000 !important;font-size:20px !important;font-weight:800 !important;margin-top:24px}.quote-content-chip .snowflake-content-chip-image{width:140px !important}@media screen and (min-width:992px){.quote-content-chip .snowflake-content-chip-image{position:absolute !important;bottom:24px;right:16px}}@media screen and (max-width:991px){.quote-content-chip .snowflake-content-chip-image{margin-bottom:40px}.quote-content-chip{flex-direction:column}}#spa-root{background-color:#fff}.lowercase .snowflake-title-v2-line{text-transform:none !important}.centered .snowflake-logo-content-container-inner{justify-content:center}div.snowflake-linklist-dropdown-menu{max-height:380px}.first-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:first-child{color:var(--ui-01) !important}.is-front{position:relative;z-index:2}.use-case-body .snowflake-text h1,.use-case-body .snowflake-text h2,.use-case-body .snowflake-text h3,.use-case-body .snowflake-text h4,.use-case-body .snowflake-text h5,.use-case-body .snowflake-text h6{font-family:'Texta',sans-serif;color:#000;margin:.25rem 0 0 0}.pc-hero .button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:flex-start}.sf-footer .mktoFormRow .mktoHtmlText span{font-family:'Lato',sans-serif !important}.snowflake-button-primary.snowflake-button-blue .snowflake-button-container{justify-content:center}.related-chip-25{background-color:#fff;border:1px solid rgba(204,204,204,.5);border-radius:8px;padding:20px;position:relative}.related-chip-25:hover{box-shadow:rgba(152,162,179,.1) 0 10px 20px 0}.related-chip-25:hover::after{right:24px;transition:300ms ease right}.related-chip-25::after{content:'';display:block;transition:300ms ease right;background-image:url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 .947072C1.84529 .429617 1.0164 .429617 .517219 .947072C.0427878 1.43887 .042788 2.21798 .517219 2.70978L4.65591 7L.51722 11.2902C.0427889 11.782 .0427887 12.5611 .51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");width:8px;height:14px;display:block;position:absolute;right:30px;top:50%;transform:translateY(-50%);background-size:contain;background-position:center;background-repeat:no-repeat}.related-chip-25 .heading-5-v2{font-size:22px;line-height:1.1}.related-chip-25 .snowflake-content-chip-image{width:48px;flex-shrink:0}.related-chip-25 .snowflake-content-chip-image__image{aspect-ratio:1;height:auto;object-fit:contain}.related-chip-25 .snowflake-content-chip-button{display:none}.related-chip-25 .snowflake-content-chip-content-without-tag{flex-grow:1;padding-right:24px}.case-study-25.small-logo .snowflake-case-study-card-logo img{width:60px !important}.swiper-slide .case-study-25{width:95%;margin-left:auto;margin-right:auto}.case-study-25 .snowflake-case-study-card-logo img{width:140px !important;height:auto !important;transform:none !important;margin:24px 0 8px 0}.case-study-25 .snowflake-case-study-card-image__image{object-position:left center}.case-study-25 .snowflake-case-study-card-information-container{padding-right:24px}.case-study-25 ul{list-style-type:none;padding:0;margin:8px 0 0 0}.case-study-25 li{font-size:15px !important;line-height:1.3 !important;display:flex;flex-direction:column;border-left:4px solid var(--ui-01);padding-left:24px;margin-top:24px;color:#535862;gap:4px}.case-study-25 li b{display:block;font-family:'Texta',sans-serif;font-weight:900 !important;font-size:48px !important;line-height:.9 !important;color:var(--ui-01)}.case-study-25 .snowflake-case-study-card-description p{color:#535862}.case-study-25 .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){color:#000;font-family:Texta;font-size:30px !important;line-height:1 !important;font-style:normal;font-weight:700;text-indent:-8px}.case-study-25.is-story .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){text-indent:0}.case-study-25 .snowflake-case-study-card-key-card{background-color:transparent}.case-study-25 .snowflake-case-study-card-button{display:none}.case-study-25{border-radius:24px;overflow:hidden}@media screen and (min-width:1024px){.case-study-25 .snowflake-case-study-card-left-container{position:static;width:60%;min-height:0}.case-study-25 .snowflake-case-study-card-right-container::after{content:'';display:block;width:60%;max-width:340px;padding-bottom:50%;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 22 16' class='snowflake-pushdown-banner-placeholder-arrow'%3E%3Cpath fill='%2329B5E8' fill-rule='evenodd' d='M17.865 8.756c.088-.274.124-.555.118-.834a2.551 2.551 0 0 0-1.3-2.142L7.887.76C6.645.055 5.063.475 4.35 1.7a2.535 2.535 0 0 0 .947 3.494l4.916 2.809-4.916 2.801a2.543 2.543 0 0 0-.947 3.502c.713 1.222 2.295 1.64 3.537.934l8.796-5.024a2.541 2.541 0 0 0 1.182-1.46Z' clip-rule='evenodd'%3E%3C/path%3E%3C/svg%3E\");background-size:contain;background-repeat:no-repeat;position:absolute;top:-10%;left:-20%}.case-study-25 .snowflake-case-study-card-right-container{max-width:none;width:40%;position:absolute;top:-5%;right:-5%;z-index:0;height:110%}}@media screen and (min-width:768px){.case-study-25 li{max-width:50%}.case-study-25 ul{display:flex;gap:48px}}.snowflake-text.section-eyebrow p{margin-left:auto;margin-right:auto;margin-bottom:16px !important}.snowflake-text.section-eyebrow p,.snowflake-text.eyebrow-text p{text-transform:uppercase;font-family:'Texta',sans-serif !important;font-weight:800 !important;letter-spacing:.025em;margin-bottom:12px;line-height:1.1 !important}.snowflake-title-v2.dynamic .heading-2-v2 span.snowflake-title-v2-line{font-size:clamp(2.5rem,4.5vw,4rem) !important;line-height:.82 !important}.checklist ul{padding:0;margin:0}.checklist ul li{list-style-type:none;padding-left:32px;position:relative}.checklist ul li:not(:last-child){margin-bottom:1em}.checklist ul li::before{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='25' viewBox='0 0 24 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect y='.985352' width='24' height='24' rx='12' fill='%23D4F0FA'/%3E%3Cpath d='M7.28613 13.2967L10.7147 16.7253L17.5718 9.86816' stroke='%2329B5E8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;position:absolute;top:3px;left:0}.last-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:last-child{color:var(--ui-01)}.snowflake-text p sup{line-height:0}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px;line-height:1;text-transform:none;font-weight:700}.snowflake-title-v2.lowercase .heading-2-v2{font-size:32px;line-height:1;text-transform:none;font-weight:700}.content-chip-new{border:1px solid rgba(204,204,204,.5);border-radius:16px;overflow:hidden}.content-chip-new .snowflake-image-container{border-radius:0;display:none}.content-chip-new .snowflake-content-chip-image{margin-right:0;max-width:180px;flex-shrink:0}.content-chip-new .snowflake-content-chip-content{padding:24px}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:first-child{font-size:24px;line-height:1.1}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){font-family:'Lato',sans-serif;font-size:17px;color:#535862 !important;font-weight:500;line-height:1.45;margin-top:8px;display:none}div.snowflake-text a{font-weight:normal;color:var(--ui-01);text-decoration:underline;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:transparent;transition:300ms ease text-decoration-color}div.snowflake-text a:hover{text-decoration-color:var(--ui-01);transition:300ms ease text-decoration-color}.footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container .snowflake-button-primary+.snowflake-button-link{margin-left:12px !important}.snowflake-button-regular.snowflake-button-link .snowflake-button-container{font-size:18px !important;text-align:left;justify-content:flex-start;line-height:1.4 !important}body .snowflake-card-v2-advanced{border:1px solid rgba(204,204,204,.5);border-radius:var(--spacing-02);transition:300ms ease all}body .snowflake-card-v2-advanced:hover{box-shadow:rgba(152,162,179,.1) 0 10px 20px 0;transition:300ms ease all}body .snowflake-card-v2-advanced-inner{border-bottom:none}body .snowflake-card-v2-advanced-image{line-height:0}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9}body .snowflake-card-v2-advanced-content{position:relative}body .snowflake-card-v2-advanced-content::after{content:'';display:block;position:absolute;bottom:0;left:0;transition:300ms ease all;width:20%;height:4px;background-color:var(--ui-01);opacity:0}body .snowflake-card-v2-advanced:hover .snowflake-card-v2-advanced-content::after{width:100%;opacity:1;transition:300ms ease all}body .snowflake-card-v2-advanced .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transition:300ms ease transform}body .snowflake-card-v2-advanced:hover .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transform:translateX(4px);transition:300ms ease transform}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-wrap:wrap;gap:24px}.six-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:100%;margin:0 !important}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px);margin:0 !important}@media screen and (min-width:768px){.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}}@media screen and (min-width:1024px){.snowflake-title-v2.lowercase .heading-3-v2{font-size:34px}.snowflake-title-v2.lowercase.larger .heading-2-v2{font-size:44px;line-height:.95}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(25% - 18px)}.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(20% - 19.2px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(16.6666% - 20px)}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px !important}}@media screen and (min-width:1200px){.snowflake-title-v2.lowercase .heading-2-v2{font-size:40px}.content-chip-new .snowflake-content-chip-content{padding:32px}.content-chip-new .snowflake-image-container,.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){display:block}}.promo-banner-25{border-radius:16px;overflow:hidden}.promo-banner-25 .snowflake-premium-content-banner-image-container{position:relative;max-width:380px}.promo-banner-25 .snowflake-text{color:#535862}.promo-banner-25 .snowflake-premium-content-banner-image__image{transform:translateY(8px);transition:300ms ease transform;border-radius:0;width:85%;margin:0 auto;display:block;position:relative;z-index:1}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover .snowflake-premium-content-banner-image__image{transform:translateY(0);transition:300ms ease transform}.promo-banner-25 .snowflake-premium-content-banner-image__inner{height:auto;padding-top:24px}.promo-banner-25 .snowflake-premium-content-banner-image__link{position:relative;z-index:1;height:auto}.promo-banner-25 .snowflake-premium-content-banner-image__link::after{content:'';display:block;position:absolute;clip-path:polygon(0 0,66% 0,100% 100%,0 100%);bottom:0;left:0;width:100%;height:100%;background:var(--ui-01);transition:300ms ease width}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover::after{width:110%;transition:300ms ease width}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-position:95% 50%}.sf-footer__disclaimers .text-size-small .snowflake-text p{color:#fff !important;font-size:10px !important;opacity:.8}@media screen and (min-width:768px){.sf-footer__disclaimers .text-size-small .snowflake-text p{font-size:12px !important}}@media screen and (max-width:1023px){.mobile-top-padding{padding-top:64px}}@media (max-width:799px){.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative .mktoButton{width:100% !important}.sf-footer__logo{text-align:center;display:block;margin:0 auto}}.customer-card .snowflake-card-v2-advanced-image{aspect-ratio:4.35 / 1}.customer-card .snowflake-card-v2-advanced-image__image{width:100%;height:100%;padding-left:8px;object-fit:contain;object-position:left center;margin:0 !important;aspect-ratio:initial}.customer-card .snowflake-card-v2-advanced-image__inner{height:110px}.customer-card .snowflake-card-v2-advanced-tag-indicator{display:none}.pc-hero .snowflake-container-arrow-small-gray-image{top:-34% !important;width:18% !important}.pc-hero .snowflake-container-arrow-small-gray-image path{fill:var(--ui-01);opacity:1}@media screen and (max-width:767px){.mobile-padding-top{padding-top:64px}.hide-mobile{display:none !important}.pc-hero{padding-top:52px}.pc-hero .snowflake-text p,.pc-hero .left-alignment .snowflake-title-v2-line,.pc-hero h1 span{text-align:center !important}}div.snowflake-pushdown-banner-button{margin-top:0}.button-group.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:center !important}.text-center .snowflake-breadcrumb-swiper .swiper-wrapper{justify-content:center}div.snowflake-breadcrumb a.snowflake-breadcrumb-item,.snowflake-breadcrumb div.snowflake-breadcrumb-item{text-transform:none;font-weight:500}.snowflake-breadcrumb svg{display:none !important}.snowflake-breadcrumb a:has(svg)::after{content:'/';margin:0 12px;color:#666}.hide-filters .snowflake-filterable-and-searchable-grid-top-part{display:none !important}.page-section{padding-left:24px;padding-right:24px}@media screen and (min-width:768px){.page-section{padding-left:48px;padding-right:48px}}.download-card pre[class*=language-]{overflow-x:scroll !important}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container_copy","container_573483281_","markup_editor_copy"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-a7fa93a7d6","title":"Quickstarts Overrides","cssContent":".snowflake-markdown blockquote{padding:24px 32px;background:#f6f9fa;border:1px solid #29b5e8;border-radius:16px}.snowflake-markdown .snowflake-image-container img{width:auto !important;max-width:100%}.snowflake-markdown .snowflake-text ol{padding-left:20px !important}.snowflake-markdown .snowflake-text li{margin:0 0 12px 0 !important}.snowflake-markdown h3.snowflake-markdown-h3{font-size:20px !important;font-family:Texta,sans-serif !important}@media (min-width:768px){.snowflake-markdown h3.snowflake-markdown-h3{font-size:28px !important}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["experiencefragment-banner","experiencefragment-header","markup_editor_1950346551","responsivegrid","modal_container","experiencefragment-footer","markup_editor"],":type":"wcm/foundation/components/responsivegrid"}},":itemsOrder":["root"],":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/getting-started-with-time-series-using-snowflake-streaming-sis-ml-notebooks","locale":"en"}
  