2023-07-12 11:28:07 +03:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "x-ua-compatible" content = "ie=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2024-01-16 10:41:49 +03:00
< meta name = "generator" content = "ExDoc v0.31.1" >
2023-07-12 11:28:07 +03:00
< meta name = "project" content = "Plausible v0.0.1" >
2024-01-11 10:50:44 +03:00
2024-07-03 16:33:03 +03:00
< title > Plausible.Stats.SQL.Fragments — Plausible v0.0.1< / title >
2024-01-16 10:41:49 +03:00
< link rel = "stylesheet" href = "dist/html-elixir-FM2CSD74.css" / >
2023-07-12 11:28:07 +03:00
< script src = "dist/handlebars.runtime-NWIB6V2M.js" > < / script >
2024-01-11 10:50:44 +03:00
< script src = "dist/handlebars.templates-43PMFBC7.js" > < / script >
2024-09-30 19:22:04 +03:00
< script src = "dist/sidebar_items-128A95CD.js" > < / script >
2023-07-12 11:28:07 +03:00
< script src = "docs_config.js" > < / script >
2024-01-16 10:41:49 +03:00
< script async src = "dist/html-L4O5OK2K.js" > < / script >
2023-07-12 11:28:07 +03:00
< / head >
< body data-type = "modules" class = "page-module" >
< script >
try {
var settings = JSON.parse(localStorage.getItem('ex_doc:settings') || '{}');
if (settings.theme === 'dark' ||
((settings.theme === 'system' || settings.theme == null) & &
window.matchMedia('(prefers-color-scheme: dark)').matches)
) {
document.body.classList.add('dark')
}
} catch (error) { }
< / script >
< div class = "main" >
2024-01-16 10:41:49 +03:00
< button id = "sidebar-menu" class = "sidebar-button sidebar-toggle" aria-label = "toggle sidebar" aria-controls = "sidebar" >
2023-07-12 11:28:07 +03:00
< i class = "ri-menu-line ri-lg" title = "Collapse/expand sidebar" > < / i >
< / button >
2024-01-16 10:41:49 +03:00
< div class = "background-layer" > < / div >
2024-01-11 10:50:44 +03:00
< nav id = "sidebar" class = "sidebar" >
2023-07-12 11:28:07 +03:00
< div class = "sidebar-header" >
2024-01-11 10:50:44 +03:00
< div class = "sidebar-projectInfo" >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< a href = "readme.html" class = "sidebar-projectImage" >
< img src = "assets/logo.png" alt = "Plausible" / >
< / a >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< div >
< a href = "readme.html" class = "sidebar-projectName" translate = "no" >
2023-07-12 11:28:07 +03:00
Plausible
2024-01-11 10:50:44 +03:00
< / a >
< div class = "sidebar-projectVersion" translate = "no" >
v0.0.1
< / div >
2023-07-12 11:28:07 +03:00
< / div >
< / div >
2024-01-11 10:50:44 +03:00
< ul id = "sidebar-listNav" class = "sidebar-listNav" role = "tablist" >
< li >
< button id = "extras-list-tab-button" role = "tab" data-type = "extras" aria-controls = "extras-tab-panel" aria-selected = "true" tabindex = "0" >
Pages
< / button >
< / li >
< li >
< button id = "modules-list-tab-button" role = "tab" data-type = "modules" aria-controls = "modules-tab-panel" aria-selected = "false" tabindex = "-1" >
Modules
< / button >
< / li >
< li >
< button id = "tasks-list-tab-button" role = "tab" data-type = "tasks" aria-controls = "tasks-tab-panel" aria-selected = "false" tabindex = "-1" >
< span translate = "no" > Mix< / span > Tasks
< / button >
< / li >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< / ul >
< / div >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< div id = "extras-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "extras-list-tab-button" >
< ul id = "extras-full-list" class = "full-list" > < / ul >
< / div >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< div id = "modules-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "modules-list-tab-button" hidden >
< ul id = "modules-full-list" class = "full-list" > < / ul >
< / div >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< div id = "tasks-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "tasks-list-tab-button" hidden >
< ul id = "tasks-full-list" class = "full-list" > < / ul >
< / div >
< / nav >
2023-07-12 11:28:07 +03:00
2024-01-11 10:50:44 +03:00
< main class = "content" >
2023-07-12 11:28:07 +03:00
< output role = "status" id = "toast" > < / output >
< div class = "content-outer" >
< div id = "content" class = "content-inner" >
2024-01-11 10:50:44 +03:00
< div class = "top-search" >
< div class = "search-settings" >
< form class = "search-bar" action = "search.html" >
< label class = "search-label" >
< span class = "sr-only" > Search documentation of Plausible< / span >
< input name = "q" type = "text" class = "search-input" placeholder = "Search Documentation (press /)" autocomplete = "off" autocorrect = "off" autocapitalize = "off" spellcheck = "false" / >
< / label >
< button type = "submit" class = "search-button" aria-label = "Submit Search" >
< i class = "ri-search-2-line ri-lg" aria-hidden = "true" title = "Submit search" > < / i >
< / button >
< button type = "button" tabindex = "-1" class = "search-close-button" aria-hidden = "true" >
< i class = "ri-close-line ri-lg" title = "Cancel search" > < / i >
< / button >
< / form >
2024-01-16 10:41:49 +03:00
< div class = "autocomplete" >
< / div >
2024-01-11 10:50:44 +03:00
< button class = "icon-settings display-settings" >
< i class = "ri-settings-3-line" > < / i >
< span class = "sr-only" > Settings< / span >
< / button >
< / div >
2024-01-16 10:41:49 +03:00
2024-01-11 10:50:44 +03:00
< / div >
2023-07-12 11:28:07 +03:00
< h1 >
2024-07-03 16:33:03 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L1" title = "View Source" class = "icon-action" rel = "help" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
2024-07-03 16:33:03 +03:00
< span translate = "no" > Plausible.Stats.SQL.Fragments< / span >
2023-07-12 11:28:07 +03:00
< small class = "app-vsn" translate = "no" > (Plausible v0.0.1)< / small >
< / h1 >
2024-07-03 16:33:03 +03:00
< section id = "moduledoc" >
< p > Various macros and common SQL fragments used in Stats code.< / p >
< / section >
2023-07-12 11:28:07 +03:00
< section id = "summary" class = "details-list" >
< h1 class = "section-heading" >
< a class = "hover-link" href = "#summary" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Summary< / span >
2023-07-12 11:28:07 +03:00
< / h1 >
< div class = "summary-functions summary" >
< h2 >
< a href = "#functions" > Functions< / a >
< / h2 >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#bounce_rate/0" translate = "no" > bounce_rate()< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#coalesce_string/2" translate = "no" > coalesce_string(fieldA, fieldB)< / a >
< / div >
< / div >
2024-01-23 10:33:37 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#get_by_key/3" translate = "no" > get_by_key(table, meta_column, key)< / a >
< / div >
< div class = "summary-synopsis" > < p > Returns value of a key (usually property) under < code class = "inline" > meta.value< / code > array or similar.< / p > < / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#has_key/3" translate = "no" > has_key(table, meta_column, key)< / a >
< / div >
< div class = "summary-synopsis" > < p > Returns whether a key (usually property) exists under < code class = "inline" > meta.key< / code > array or similar.< / p > < / div >
< / div >
2024-05-14 11:58:47 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#meta_key_column/1" translate = "no" > meta_key_column(atom)< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#meta_value_column/1" translate = "no" > meta_value_column(atom)< / a >
< / div >
< / div >
2023-07-12 11:28:07 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#sample_percent/0" translate = "no" > sample_percent()< / a >
< / div >
< / div >
2024-07-09 14:25:40 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#select_join_fields/4" translate = "no" > select_join_fields(q, query, list, table_name)< / a >
< / div >
< div class = "summary-synopsis" > < p > Macro that helps join two Ecto queries by selecting fields from either one< / p > < / div >
< / div >
2024-07-03 16:33:03 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#select_merge_as/3" translate = "no" > select_merge_as(q, binding, map_literal)< / a >
< / div >
< div class = "summary-synopsis" > < p > Convenience Ecto macro for wrapping select_merge where each value gets in turn passed to selected_as.< / p > < / div >
< / div >
2023-07-12 11:28:07 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#to_timezone/2" translate = "no" > to_timezone(date, timezone)< / a >
< / div >
< div class = "summary-synopsis" > < p > Converts time or date and time to the specified timezone.< / p > < / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#total/0" translate = "no" > total()< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#uniq/1" translate = "no" > uniq(user_id)< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#visit_duration/0" translate = "no" > visit_duration()< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#weekstart_not_before/2" translate = "no" > weekstart_not_before(date, not_before)< / a >
< / div >
< div class = "summary-synopsis" > < p > Returns the weekstart for < code class = "inline" > date< / code > . If the weekstart is before the < code class = "inline" > not_before< / code >
boundary, < code class = "inline" > not_before< / code > is returned.< / p > < / div >
< / div >
2024-07-03 16:33:03 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#wrap_alias/2" translate = "no" > wrap_alias(binding, map_literal)< / a >
< / div >
< div class = "summary-synopsis" > < p > Convenience Ecto macro for wrapping a map passed to select_merge_as such that each
expression gets wrapped in dynamic and set as selected_as.< / p > < / div >
< / div >
2023-07-12 11:28:07 +03:00
< / div >
< / section >
< section id = "functions" class = "details-list" >
< h1 class = "section-heading" >
< a class = "hover-link" href = "#functions" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
2023-07-25 10:58:48 +03:00
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Functions< / span >
2023-07-12 11:28:07 +03:00
< / h1 >
< div class = "functions-list" >
< section class = "detail" id = "bounce_rate/0" >
< div class = "detail-header" >
< a href = "#bounce_rate/0" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > bounce_rate()< / h1 >
2024-07-03 16:33:03 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L31" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< / section >
< / section >
< section class = "detail" id = "coalesce_string/2" >
< div class = "detail-header" >
< a href = "#coalesce_string/2" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > coalesce_string(fieldA, fieldB)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L48" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
2024-01-23 10:33:37 +03:00
< / section >
< / section >
< section class = "detail" id = "get_by_key/3" >
< div class = "detail-header" >
< a href = "#get_by_key/3" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > get_by_key(table, meta_column, key)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L134" class = "icon-action" rel = "help" title = "View Source" >
2024-01-23 10:33:37 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Returns value of a key (usually property) under < code class = "inline" > meta.value< / code > array or similar.< / p > < p > This macro is used for operating on custom properties.
Callsites should also check whether key exists first in SQL via < code class = "inline" > has_key< / code > macro.< / p > < h2 id = "get_by_key/3-examples" class = "section-heading" >
< a href = "#get_by_key/3-examples" class = "hover-link" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
< span class = "text" > Examples< / span >
< / h2 >
< p > < code class = "inline" > get_by_key(e, :meta, " some_property_name" )< / code > expands to SQL < code class = "inline" > meta.value[indexOf(meta.key, " some_property" )]< / code > < / p >
< / section >
< / section >
< section class = "detail" id = "has_key/3" >
< div class = "detail-header" >
< a href = "#has_key/3" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > has_key(table, meta_column, key)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L114" class = "icon-action" rel = "help" title = "View Source" >
2024-01-23 10:33:37 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Returns whether a key (usually property) exists under < code class = "inline" > meta.key< / code > array or similar.< / p > < p > This macro is used for operating on custom properties.< / p > < h2 id = "has_key/3-examples" class = "section-heading" >
< a href = "#has_key/3-examples" class = "hover-link" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
< span class = "text" > Examples< / span >
< / h2 >
< p > < code class = "inline" > has_key(e, :meta, " some_property_name" )< / code > expands to SQL < code class = "inline" > has(meta.key, " some_property_name" )< / code > < / p >
2024-05-14 11:58:47 +03:00
< / section >
< / section >
< section class = "detail" id = "meta_key_column/1" >
< div class = "detail-header" >
< a href = "#meta_key_column/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > meta_key_column(atom)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L145" class = "icon-action" rel = "help" title = "View Source" >
2024-05-14 11:58:47 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< / section >
< / section >
< section class = "detail" id = "meta_value_column/1" >
< div class = "detail-header" >
< a href = "#meta_value_column/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > meta_value_column(atom)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L148" class = "icon-action" rel = "help" title = "View Source" >
2024-05-14 11:58:47 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-07-12 11:28:07 +03:00
< / section >
< / section >
< section class = "detail" id = "sample_percent/0" >
< div class = "detail-header" >
< a href = "#sample_percent/0" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > sample_percent()< / h1 >
2024-07-03 16:33:03 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L25" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
2024-07-09 14:25:40 +03:00
< / section >
< / section >
< section class = "detail" id = "select_join_fields/4" >
< div class = "detail-header" >
< a href = "#select_join_fields/4" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > select_join_fields(q, query, list, table_name)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L190" class = "icon-action" rel = "help" title = "View Source" >
2024-07-09 14:25:40 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Macro that helps join two Ecto queries by selecting fields from either one< / p >
2023-07-12 11:28:07 +03:00
< / section >
< / section >
2024-07-03 16:33:03 +03:00
< section class = "detail" id = "select_merge_as/3" >
< div class = "detail-header" >
< a href = "#select_merge_as/3" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > select_merge_as(q, binding, map_literal)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L181" class = "icon-action" rel = "help" title = "View Source" >
2024-07-03 16:33:03 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Convenience Ecto macro for wrapping select_merge where each value gets in turn passed to selected_as.< / p > < h3 id = "select_merge_as/3-examples" class = "section-heading" >
< a href = "#select_merge_as/3-examples" class = "hover-link" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
< span class = "text" > Examples< / span >
< / h3 >
< p > iex> select_merge_as(q, [t], %{ foo: t.column }) |> expand_macro_once
" select_merge(q, [], ^wrap_alias([t], %{foo: t.column}))" < / p >
< / section >
< / section >
2023-07-12 11:28:07 +03:00
< section class = "detail" id = "to_timezone/2" >
< div class = "detail-header" >
< a href = "#to_timezone/2" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > to_timezone(date, timezone)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L59" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Converts time or date and time to the specified timezone.< / p > < p > Reference: < a href = "https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone" > https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone< / a > < / p >
< / section >
< / section >
< section class = "detail" id = "total/0" >
< div class = "detail-header" >
< a href = "#total/0" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > total()< / h1 >
2024-07-03 16:33:03 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L19" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< / section >
< / section >
< section class = "detail" id = "uniq/1" >
< div class = "detail-header" >
< a href = "#uniq/1" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > uniq(user_id)< / h1 >
2024-07-03 16:33:03 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L13" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< / section >
< / section >
< section class = "detail" id = "visit_duration/0" >
< div class = "detail-header" >
< a href = "#visit_duration/0" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > visit_duration()< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L42" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< / section >
< / section >
< section class = "detail" id = "weekstart_not_before/2" >
< div class = "detail-header" >
< a href = "#weekstart_not_before/2" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > weekstart_not_before(date, not_before)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L93" class = "icon-action" rel = "help" title = "View Source" >
2023-07-12 11:28:07 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Returns the weekstart for < code class = "inline" > date< / code > . If the weekstart is before the < code class = "inline" > not_before< / code >
boundary, < code class = "inline" > not_before< / code > is returned.< / p > < h2 id = "weekstart_not_before/2-examples" class = "section-heading" >
2024-01-11 10:50:44 +03:00
< a href = "#weekstart_not_before/2-examples" class = "hover-link" >
2023-07-25 10:58:48 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
2023-07-12 11:28:07 +03:00
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Examples< / span >
2023-07-12 11:28:07 +03:00
< / h2 >
< p > In this pseudo-code example, the fragment returns the weekstart. The
< code class = "inline" > not_before< / code > boundary is set to the past Saturday, which is before the
2024-07-03 16:33:03 +03:00
weekstart, therefore the cap does not apply.< / p > < pre > < code class = "makeup elixir" translate = "no" > < span class = "w" > < / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > this_wednesday< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "ld" > ~D[2022-11-09]< / span > < span class = "w" >
< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > past_saturday< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "ld" > ~D[2022-11-05]< / span > < span class = "w" >
2024-09-30 19:22:04 +03:00
< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > weekstart_not_before< / span > < span class = "p" data-group-id = "5339235777-1" > (< / span > < span class = "n" > this_wednesday< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > past_saturday< / span > < span class = "p" data-group-id = "5339235777-1" > )< / span > < span class = "w" >
2024-07-03 16:33:03 +03:00
< / span > < span class = "ld" > ~D[2022-11-07]< / span > < / code > < / pre > < p > In this other example, the fragment returns Tuesday and not the weekstart.
2023-07-12 11:28:07 +03:00
The < code class = "inline" > not_before< / code > boundary is set to Tuesday, which is past the weekstart,
2024-07-03 16:33:03 +03:00
therefore the cap applies.< / p > < pre > < code class = "makeup elixir" translate = "no" > < span class = "w" > < / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > this_wednesday< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "ld" > ~D[2022-11-09]< / span > < span class = "w" >
< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > this_tuesday< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "ld" > ~D[2022-11-08]< / span > < span class = "w" >
2024-09-30 19:22:04 +03:00
< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > weekstart_not_before< / span > < span class = "p" data-group-id = "3475402013-1" > (< / span > < span class = "n" > this_wednesday< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > this_tuesday< / span > < span class = "p" data-group-id = "3475402013-1" > )< / span > < span class = "w" >
2024-07-03 16:33:03 +03:00
< / span > < span class = "ld" > ~D[2022-11-08]< / span > < / code > < / pre >
2023-07-12 11:28:07 +03:00
< / section >
< / section >
2024-07-03 16:33:03 +03:00
< section class = "detail" id = "wrap_alias/2" >
< div class = "detail-header" >
< a href = "#wrap_alias/2" class = "detail-link" title = "Link to this macro" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this macro< / span >
< / a >
< h1 class = "signature" translate = "no" > wrap_alias(binding, map_literal)< / h1 >
2024-09-10 14:23:28 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/stats/sql/fragments.ex#L160" class = "icon-action" rel = "help" title = "View Source" >
2024-07-03 16:33:03 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< span class = "note" > (macro)< / span >
< / div >
< section class = "docstring" >
< p > Convenience Ecto macro for wrapping a map passed to select_merge_as such that each
expression gets wrapped in dynamic and set as selected_as.< / p > < h3 id = "wrap_alias/2-examples" class = "section-heading" >
< a href = "#wrap_alias/2-examples" class = "hover-link" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
< span class = "text" > Examples< / span >
< / h3 >
< p > iex> wrap_alias([t], %{ foo: t.column }) |> expand_macro_once
" %{foo: dynamic([t], selected_as(t.column, :foo))}" < / p >
< / section >
< / section >
2023-07-12 11:28:07 +03:00
< / div >
< / section >
< footer class = "footer" >
< p >
< span class = "line" >
< button class = "a-main footer-button display-quick-switch" title = "Search HexDocs packages" >
Search HexDocs
< / button >
< a href = "Plausible.epub" title = "ePub version" >
Download ePub version
< / a >
< / span >
< / p >
< p class = "built-using" >
Built using
2024-01-16 10:41:49 +03:00
< a href = "https://github.com/elixir-lang/ex_doc" title = "ExDoc" target = "_blank" rel = "help noopener" translate = "no" > ExDoc< / a > (v0.31.1) for the
2023-07-12 11:28:07 +03:00
< a href = "https://elixir-lang.org" title = "Elixir" target = "_blank" translate = "no" > Elixir programming language< / a >
< / p >
< / footer >
< / div >
< / div >
2024-01-11 10:50:44 +03:00
< / main >
2023-07-12 11:28:07 +03:00
< / div >
< script src = "https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js" > < / script >
< script > mermaid . initialize ( { startOnLoad : true } ) < / script >
< / body >
< / html >