blob: 207ffff7296e12e0ad03890ce9587c4d4f3432ec [file] [log] [blame]
<!DOCTYPE html>
<html class="no-js">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GROUP BY Clause - Spark 4.1.0-preview1 Documentation</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&Courier+Prime:wght@400;700&display=swap" rel="stylesheet">
<link href="css/custom.css" rel="stylesheet">
<script src="js/vendor/modernizr-2.6.1-respond-1.1.0.min.js"></script>
<link rel="stylesheet" href="css/pygments-default.css">
<link rel="stylesheet" href="css/docsearch.min.css" />
<link rel="stylesheet" href="css/docsearch.css">
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '40']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body class="global">
<!-- This code is taken from http://twitter.github.com/bootstrap/examples/hero.html -->
<nav class="navbar navbar-expand-lg navbar-dark p-0 px-4 fixed-top" style="background: #1d6890;" id="topbar">
<div class="navbar-brand"><a href="index.html">
<img src="https://spark.apache.org/images/spark-logo-rev.svg" width="141" height="72"/></a><span class="version">4.1.0-preview1</span>
</div>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarCollapse" aria-controls="navbarCollapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto">
<li class="nav-item"><a href="index.html" class="nav-link">Overview</a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarQuickStart" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Programming Guides</a>
<div class="dropdown-menu" aria-labelledby="navbarQuickStart">
<a class="dropdown-item" href="quick-start.html">Quick Start</a>
<a class="dropdown-item" href="rdd-programming-guide.html">RDDs, Accumulators, Broadcasts Vars</a>
<a class="dropdown-item" href="sql-programming-guide.html">SQL, DataFrames, and Datasets</a>
<a class="dropdown-item" href="streaming/index.html">Structured Streaming</a>
<a class="dropdown-item" href="streaming-programming-guide.html">Spark Streaming (DStreams)</a>
<a class="dropdown-item" href="ml-guide.html">MLlib (Machine Learning)</a>
<a class="dropdown-item" href="graphx-programming-guide.html">GraphX (Graph Processing)</a>
<a class="dropdown-item" href="sparkr.html">SparkR (R on Spark)</a>
<a class="dropdown-item" href="api/python/getting_started/index.html">PySpark (Python on Spark)</a>
<a class="dropdown-item" href="declarative-pipelines-programming-guide.html">Declarative Pipelines</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarAPIDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">API Docs</a>
<div class="dropdown-menu" aria-labelledby="navbarAPIDocs">
<a class="dropdown-item" href="api/python/index.html">Python</a>
<a class="dropdown-item" href="api/scala/org/apache/spark/index.html">Scala</a>
<a class="dropdown-item" href="api/java/index.html">Java</a>
<a class="dropdown-item" href="api/R/index.html">R</a>
<a class="dropdown-item" href="api/sql/index.html">SQL, Built-in Functions</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarDeploying" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Deploying</a>
<div class="dropdown-menu" aria-labelledby="navbarDeploying">
<a class="dropdown-item" href="cluster-overview.html">Overview</a>
<a class="dropdown-item" href="submitting-applications.html">Submitting Applications</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="spark-standalone.html">Spark Standalone</a>
<a class="dropdown-item" href="running-on-yarn.html">YARN</a>
<a class="dropdown-item" href="running-on-kubernetes.html">Kubernetes</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarMore" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">More</a>
<div class="dropdown-menu" aria-labelledby="navbarMore">
<a class="dropdown-item" href="configuration.html">Configuration</a>
<a class="dropdown-item" href="monitoring.html">Monitoring</a>
<a class="dropdown-item" href="tuning.html">Tuning Guide</a>
<a class="dropdown-item" href="job-scheduling.html">Job Scheduling</a>
<a class="dropdown-item" href="security.html">Security</a>
<a class="dropdown-item" href="hardware-provisioning.html">Hardware Provisioning</a>
<a class="dropdown-item" href="migration-guide.html">Migration Guide</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="building-spark.html">Building Spark</a>
<a class="dropdown-item" href="https://spark.apache.org/contributing.html">Contributing to Spark</a>
<a class="dropdown-item" href="https://spark.apache.org/third-party-projects.html">Third Party Projects</a>
</div>
</li>
<li class="nav-item">
<input type="text" id="docsearch-input" placeholder="Search the docs…">
</li>
</ul>
<!--<span class="navbar-text navbar-right"><span class="version-text">v4.1.0-preview1</span></span>-->
</div>
</nav>
<div class="container">
<div class="left-menu-wrapper">
<div class="left-menu">
<h3><a href="sql-programming-guide.html">Spark SQL Guide</a></h3>
<ul>
<li>
<a href="sql-getting-started.html">
Getting Started
</a>
</li>
<li>
<a href="sql-data-sources.html">
Data Sources
</a>
</li>
<li>
<a href="sql-performance-tuning.html">
Performance Tuning
</a>
</li>
<li>
<a href="sql-distributed-sql-engine.html">
Distributed SQL Engine
</a>
</li>
<li>
<a href="sql-pyspark-pandas-with-arrow.html">
PySpark Usage Guide for Pandas with Apache Arrow
</a>
</li>
<li>
<a href="sql-migration-guide.html">
Migration Guide
</a>
</li>
<li>
<a href="sql-ref.html">
SQL Reference
</a>
</li>
<ul>
<li>
<a href="sql-ref-ansi-compliance.html">
ANSI Compliance
</a>
</li>
<li>
<a href="sql-ref-datatypes.html">
Data Types
</a>
</li>
<li>
<a href="sql-ref-datetime-pattern.html">
Datetime Pattern
</a>
</li>
<li>
<a href="sql-ref-number-pattern.html">
Number Pattern
</a>
</li>
<li>
<a href="sql-ref-operators.html">
Operators
</a>
</li>
<li>
<a href="sql-ref-functions.html">
Functions
</a>
</li>
<li>
<a href="sql-ref-identifier.html">
Identifiers
</a>
</li>
<li>
<a href="sql-ref-identifier-clause.html">
IDENTIFIER clause
</a>
</li>
<li>
<a href="sql-ref-literals.html">
Literals
</a>
</li>
<li>
<a href="sql-ref-null-semantics.html">
Null Semantics
</a>
</li>
<li>
<a href="sql-ref-syntax.html">
SQL Syntax
</a>
</li>
<ul>
<li>
<a href="sql-ref-syntax.html#ddl-statements">
Data Definition Statements
</a>
</li>
<li>
<a href="sql-ref-syntax.html#dml-statements">
Data Manipulation Statements
</a>
</li>
<li>
<a href="sql-ref-syntax.html#data-retrieval-statements">
Data Retrieval(Queries)
</a>
</li>
<li>
<a href="sql-ref-syntax.html#auxiliary-statements">
Auxiliary Statements
</a>
</li>
<li>
<a href="sql-pipe-syntax.html">
Pipe Syntax
</a>
</li>
</ul>
</ul>
<li>
<a href="sql-error-conditions.html">
Error Conditions
</a>
</li>
</ul>
</div>
</div>
<input id="nav-trigger" class="nav-trigger" checked type="checkbox">
<label for="nav-trigger"></label>
<div class="content-with-sidebar mr-3" id="content">
<h1 class="title">GROUP BY Clause</h1>
<h3 id="description">Description</h3>
<p>The <code class="language-plaintext highlighter-rouge">GROUP BY</code> clause is used to group the rows based on a set of specified grouping expressions and compute aggregations on
the group of rows based on one or more specified aggregate functions. Spark also supports advanced aggregations to do multiple
aggregations for the same input record set via <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>, <code class="language-plaintext highlighter-rouge">CUBE</code>, <code class="language-plaintext highlighter-rouge">ROLLUP</code> clauses.
The grouping expressions and advanced aggregations can be mixed in the <code class="language-plaintext highlighter-rouge">GROUP BY</code> clause and nested in a <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> clause.
See more details in the <code class="language-plaintext highlighter-rouge">Mixed/Nested Grouping Analytics</code> section. When a FILTER clause is attached to
an aggregate function, only the matching rows are passed to that function.</p>
<h3 id="syntax">Syntax</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">GROUP</span> <span class="k">BY</span> <span class="n">group_expression</span> <span class="p">[</span> <span class="p">,</span> <span class="n">group_expression</span> <span class="p">[</span> <span class="p">,</span> <span class="p">...</span> <span class="p">]</span> <span class="p">]</span> <span class="p">[</span> <span class="k">WITH</span> <span class="p">{</span> <span class="k">ROLLUP</span> <span class="o">|</span> <span class="k">CUBE</span> <span class="p">}</span> <span class="p">]</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="p">{</span> <span class="n">group_expression</span> <span class="o">|</span> <span class="p">{</span> <span class="k">ROLLUP</span> <span class="o">|</span> <span class="k">CUBE</span> <span class="o">|</span> <span class="k">GROUPING</span> <span class="k">SETS</span> <span class="p">}</span> <span class="p">(</span><span class="n">grouping_set</span> <span class="p">[</span> <span class="p">,</span> <span class="p">...])</span> <span class="p">}</span> <span class="p">[</span> <span class="p">,</span> <span class="p">...</span> <span class="p">]</span>
</code></pre></div></div>
<p>While aggregate functions are defined as</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">aggregate_name</span> <span class="p">(</span> <span class="p">[</span> <span class="k">DISTINCT</span> <span class="p">]</span> <span class="n">expression</span> <span class="p">[</span> <span class="p">,</span> <span class="p">...</span> <span class="p">]</span> <span class="p">)</span> <span class="p">[</span> <span class="n">FILTER</span> <span class="p">(</span> <span class="k">WHERE</span> <span class="n">boolean_expression</span> <span class="p">)</span> <span class="p">]</span>
</code></pre></div></div>
<h3 id="parameters">Parameters</h3>
<ul>
<li>
<p><strong>group_expression</strong></p>
<p>Specifies the criteria based on which the rows are grouped together. The grouping of rows is performed based on
result values of the grouping expressions. A grouping expression may be a column name like <code class="language-plaintext highlighter-rouge">GROUP BY a</code>, a column position like
<code class="language-plaintext highlighter-rouge">GROUP BY 0</code>, or an expression like <code class="language-plaintext highlighter-rouge">GROUP BY a + b</code>.</p>
</li>
<li>
<p><strong>grouping_set</strong></p>
<p>A grouping set is specified by zero or more comma-separated expressions in parentheses. When the
grouping set has only one element, parentheses can be omitted. For example, <code class="language-plaintext highlighter-rouge">GROUPING SETS ((a), (b))</code>
is the same as <code class="language-plaintext highlighter-rouge">GROUPING SETS (a, b)</code>.</p>
<p><strong>Syntax:</strong> <code class="language-plaintext highlighter-rouge">{ ( [ expression [ , ... ] ] ) | expression }</code></p>
</li>
<li>
<p><strong>GROUPING SETS</strong></p>
<p>Groups the rows for each grouping set specified after GROUPING SETS. For example,
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS ((warehouse), (product))</code> is semantically equivalent
to union of results of <code class="language-plaintext highlighter-rouge">GROUP BY warehouse</code> and <code class="language-plaintext highlighter-rouge">GROUP BY product</code>. This clause
is a shorthand for a <code class="language-plaintext highlighter-rouge">UNION ALL</code> where each leg of the <code class="language-plaintext highlighter-rouge">UNION ALL</code>
operator performs aggregation of each grouping set specified in the <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> clause.
Similarly, <code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS ((warehouse, product), (product), ())</code> is semantically
equivalent to the union of results of <code class="language-plaintext highlighter-rouge">GROUP BY warehouse, product</code>, <code class="language-plaintext highlighter-rouge">GROUP BY product</code>
and global aggregate.</p>
<p><strong>Note:</strong> For Hive compatibility Spark allows <code class="language-plaintext highlighter-rouge">GROUP BY ... GROUPING SETS (...)</code>. The GROUP BY
expressions are usually ignored, but if it contains extra expressions than the GROUPING SETS
expressions, the extra expressions will be included in the grouping expressions and the value
is always null. For example, <code class="language-plaintext highlighter-rouge">SELECT a, b, c FROM ... GROUP BY a, b, c GROUPING SETS (a, b)</code>,
the output of column <code class="language-plaintext highlighter-rouge">c</code> is always null.</p>
</li>
<li>
<p><strong>ROLLUP</strong></p>
<p>Specifies multiple levels of aggregations in a single statement. This clause is used to compute aggregations
based on multiple grouping sets. <code class="language-plaintext highlighter-rouge">ROLLUP</code> is a shorthand for <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>. For example,
<code class="language-plaintext highlighter-rouge">GROUP BY warehouse, product WITH ROLLUP</code> or <code class="language-plaintext highlighter-rouge">GROUP BY ROLLUP(warehouse, product)</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS((warehouse, product), (warehouse), ())</code>.
<code class="language-plaintext highlighter-rouge">GROUP BY ROLLUP(warehouse, product, (warehouse, location))</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse), ())</code>.
The N elements of a <code class="language-plaintext highlighter-rouge">ROLLUP</code> specification results in N+1 <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>.</p>
</li>
<li>
<p><strong>CUBE</strong></p>
<p><code class="language-plaintext highlighter-rouge">CUBE</code> clause is used to perform aggregations based on combination of grouping columns specified in the
<code class="language-plaintext highlighter-rouge">GROUP BY</code> clause. <code class="language-plaintext highlighter-rouge">CUBE</code> is a shorthand for <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>. For example,
<code class="language-plaintext highlighter-rouge">GROUP BY warehouse, product WITH CUBE</code> or <code class="language-plaintext highlighter-rouge">GROUP BY CUBE(warehouse, product)</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS((warehouse, product), (warehouse), (product), ())</code>.
<code class="language-plaintext highlighter-rouge">GROUP BY CUBE(warehouse, product, (warehouse, location))</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse, location),
(product, warehouse, location), (warehouse), (product), (warehouse, product), ())</code>.
The N elements of a <code class="language-plaintext highlighter-rouge">CUBE</code> specification results in 2^N <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>.</p>
</li>
<li>
<p><strong>Mixed/Nested Grouping Analytics</strong></p>
<p>A GROUP BY clause can include multiple <code class="language-plaintext highlighter-rouge">group_expression</code>s and multiple <code class="language-plaintext highlighter-rouge">CUBE|ROLLUP|GROUPING SETS</code>s.
<code class="language-plaintext highlighter-rouge">GROUPING SETS</code> can also have nested <code class="language-plaintext highlighter-rouge">CUBE|ROLLUP|GROUPING SETS</code> clauses, e.g.
<code class="language-plaintext highlighter-rouge">GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location))</code>,
<code class="language-plaintext highlighter-rouge">GROUPING SETS(warehouse, GROUPING SETS(location, GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location))))</code>.
<code class="language-plaintext highlighter-rouge">CUBE|ROLLUP</code> is just a syntax sugar for <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>, please refer to the sections above for
how to translate <code class="language-plaintext highlighter-rouge">CUBE|ROLLUP</code> to <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>. <code class="language-plaintext highlighter-rouge">group_expression</code> can be treated as a single-group
<code class="language-plaintext highlighter-rouge">GROUPING SETS</code> under this context. For multiple <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> in the <code class="language-plaintext highlighter-rouge">GROUP BY</code> clause, we generate
a single <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> by doing a cross-product of the original <code class="language-plaintext highlighter-rouge">GROUPING SETS</code>s. For nested <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> in the <code class="language-plaintext highlighter-rouge">GROUPING SETS</code> clause,
we simply take its grouping sets and strip it. For example,
<code class="language-plaintext highlighter-rouge">GROUP BY warehouse, GROUPING SETS((product), ()), GROUPING SETS((location, size), (location), (size), ())</code>
and <code class="language-plaintext highlighter-rouge">GROUP BY warehouse, ROLLUP(product), CUBE(location, size)</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS(
(warehouse, product, location, size),
(warehouse, product, location),
(warehouse, product, size),
(warehouse, product),
(warehouse, location, size),
(warehouse, location),
(warehouse, size),
(warehouse))</code>.</p>
<p><code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS(GROUPING SETS(warehouse), GROUPING SETS((warehouse, product)))</code> is equivalent to
<code class="language-plaintext highlighter-rouge">GROUP BY GROUPING SETS((warehouse), (warehouse, product))</code>.</p>
</li>
<li>
<p><strong>aggregate_name</strong></p>
<p>Specifies an aggregate function name (MIN, MAX, COUNT, SUM, AVG, etc.).</p>
</li>
<li>
<p><strong>DISTINCT</strong></p>
<p>Removes duplicates in input rows before they are passed to aggregate functions.</p>
</li>
<li>
<p><strong>FILTER</strong></p>
<p>Filters the input rows for which the <code class="language-plaintext highlighter-rouge">boolean_expression</code> in the <code class="language-plaintext highlighter-rouge">WHERE</code> clause evaluates
to true are passed to the aggregate function; other rows are discarded.</p>
</li>
</ul>
<h3 id="examples">Examples</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">dealer</span> <span class="p">(</span><span class="n">id</span> <span class="nb">INT</span><span class="p">,</span> <span class="n">city</span> <span class="n">STRING</span><span class="p">,</span> <span class="n">car_model</span> <span class="n">STRING</span><span class="p">,</span> <span class="n">quantity</span> <span class="nb">INT</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">dealer</span> <span class="k">VALUES</span>
<span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s1">'Fremont'</span><span class="p">,</span> <span class="s1">'Honda Civic'</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
<span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s1">'Fremont'</span><span class="p">,</span> <span class="s1">'Honda Accord'</span><span class="p">,</span> <span class="mi">15</span><span class="p">),</span>
<span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s1">'Fremont'</span><span class="p">,</span> <span class="s1">'Honda CRV'</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span>
<span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="s1">'Dublin'</span><span class="p">,</span> <span class="s1">'Honda Civic'</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span>
<span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="s1">'Dublin'</span><span class="p">,</span> <span class="s1">'Honda Accord'</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
<span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="s1">'Dublin'</span><span class="p">,</span> <span class="s1">'Honda CRV'</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
<span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="s1">'San Jose'</span><span class="p">,</span> <span class="s1">'Honda Civic'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
<span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="s1">'San Jose'</span><span class="p">,</span> <span class="s1">'Honda Accord'</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
<span class="c1">-- Sum of quantity per dealership. Group by `id`.</span>
<span class="k">SELECT</span> <span class="n">id</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">dealer</span> <span class="k">GROUP</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span> <span class="n">id</span><span class="o">|</span><span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span><span class="mi">100</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span>
<span class="o">|</span><span class="mi">200</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span><span class="mi">300</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="c1">-- Use column position in GROUP by clause.</span>
<span class="k">SELECT</span> <span class="n">id</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">dealer</span> <span class="k">GROUP</span> <span class="k">BY</span> <span class="mi">1</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="mi">1</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span> <span class="n">id</span><span class="o">|</span><span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span><span class="mi">100</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span>
<span class="o">|</span><span class="mi">200</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span><span class="mi">300</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="c1">-- Multiple aggregations.</span>
<span class="c1">-- 1. Sum of quantity per dealership.</span>
<span class="c1">-- 2. Max quantity per dealership.</span>
<span class="k">SELECT</span> <span class="n">id</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">AS</span> <span class="k">sum</span><span class="p">,</span> <span class="k">max</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">AS</span> <span class="k">max</span> <span class="k">FROM</span> <span class="n">dealer</span> <span class="k">GROUP</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---+---+---+</span>
<span class="o">|</span> <span class="n">id</span><span class="o">|</span><span class="k">sum</span><span class="o">|</span><span class="k">max</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+---+---+</span>
<span class="o">|</span><span class="mi">100</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span> <span class="mi">15</span><span class="o">|</span>
<span class="o">|</span><span class="mi">200</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span> <span class="mi">20</span><span class="o">|</span>
<span class="o">|</span><span class="mi">300</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span> <span class="mi">8</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+---+---+</span>
<span class="c1">-- Count the number of distinct dealer cities per car_model.</span>
<span class="k">SELECT</span> <span class="n">car_model</span><span class="p">,</span> <span class="k">count</span><span class="p">(</span><span class="k">DISTINCT</span> <span class="n">city</span><span class="p">)</span> <span class="k">AS</span> <span class="k">count</span> <span class="k">FROM</span> <span class="n">dealer</span> <span class="k">GROUP</span> <span class="k">BY</span> <span class="n">car_model</span><span class="p">;</span>
<span class="o">+</span><span class="c1">------------+-----+</span>
<span class="o">|</span> <span class="n">car_model</span><span class="o">|</span><span class="k">count</span><span class="o">|</span>
<span class="o">+</span><span class="c1">------------+-----+</span>
<span class="o">|</span> <span class="n">Honda</span> <span class="n">Civic</span><span class="o">|</span> <span class="mi">3</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Honda</span> <span class="n">CRV</span><span class="o">|</span> <span class="mi">2</span><span class="o">|</span>
<span class="o">|</span><span class="n">Honda</span> <span class="n">Accord</span><span class="o">|</span> <span class="mi">3</span><span class="o">|</span>
<span class="o">+</span><span class="c1">------------+-----+</span>
<span class="c1">-- Sum of only 'Honda Civic' and 'Honda CRV' quantities per dealership.</span>
<span class="k">SELECT</span> <span class="n">id</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="n">FILTER</span> <span class="p">(</span>
<span class="k">WHERE</span> <span class="n">car_model</span> <span class="k">IN</span> <span class="p">(</span><span class="s1">'Honda Civic'</span><span class="p">,</span> <span class="s1">'Honda CRV'</span><span class="p">)</span>
<span class="p">)</span> <span class="k">AS</span> <span class="nv">`sum(quantity)`</span> <span class="k">FROM</span> <span class="n">dealer</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span> <span class="n">id</span><span class="o">|</span><span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="o">|</span><span class="mi">100</span><span class="o">|</span> <span class="mi">17</span><span class="o">|</span>
<span class="o">|</span><span class="mi">200</span><span class="o">|</span> <span class="mi">23</span><span class="o">|</span>
<span class="o">|</span><span class="mi">300</span><span class="o">|</span> <span class="mi">5</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---+-------------+</span>
<span class="c1">-- Aggregations using multiple sets of grouping columns in a single statement.</span>
<span class="c1">-- Following performs aggregations based on four sets of grouping columns.</span>
<span class="c1">-- 1. city, car_model</span>
<span class="c1">-- 2. city</span>
<span class="c1">-- 3. car_model</span>
<span class="c1">-- 4. Empty grouping set. Returns quantities for all city and car models.</span>
<span class="k">SELECT</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">AS</span> <span class="k">sum</span> <span class="k">FROM</span> <span class="n">dealer</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="k">GROUPING</span> <span class="k">SETS</span> <span class="p">((</span><span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">),</span> <span class="p">(</span><span class="n">city</span><span class="p">),</span> <span class="p">(</span><span class="n">car_model</span><span class="p">),</span> <span class="p">())</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">city</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="n">city</span><span class="o">|</span> <span class="n">car_model</span><span class="o">|</span><span class="k">sum</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">78</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">35</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">3</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">20</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">15</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">7</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">8</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">5</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="c1">-- Group by processing with `ROLLUP` clause.</span>
<span class="c1">-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), ())</span>
<span class="k">SELECT</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">AS</span> <span class="k">sum</span> <span class="k">FROM</span> <span class="n">dealer</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span> <span class="k">WITH</span> <span class="k">ROLLUP</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="n">city</span><span class="o">|</span> <span class="n">car_model</span><span class="o">|</span><span class="k">sum</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">78</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">3</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">20</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">15</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">7</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">8</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">5</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="c1">-- Group by processing with `CUBE` clause.</span>
<span class="c1">-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())</span>
<span class="k">SELECT</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">quantity</span><span class="p">)</span> <span class="k">AS</span> <span class="k">sum</span> <span class="k">FROM</span> <span class="n">dealer</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span> <span class="k">WITH</span> <span class="k">CUBE</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">city</span><span class="p">,</span> <span class="n">car_model</span><span class="p">;</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="n">city</span><span class="o">|</span> <span class="n">car_model</span><span class="o">|</span><span class="k">sum</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">78</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">35</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">33</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">3</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Dublin</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">20</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">32</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">15</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCRV</span><span class="o">|</span> <span class="mi">7</span><span class="o">|</span>
<span class="o">|</span> <span class="n">Fremont</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">10</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="k">null</span><span class="o">|</span> <span class="mi">13</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaAccord</span><span class="o">|</span> <span class="mi">8</span><span class="o">|</span>
<span class="o">|</span> <span class="n">San</span> <span class="n">Jose</span><span class="o">|</span> <span class="n">HondaCivic</span><span class="o">|</span> <span class="mi">5</span><span class="o">|</span>
<span class="o">+</span><span class="c1">---------+------------+---+</span>
<span class="c1">--Prepare data for ignore nulls example</span>
<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">person</span> <span class="p">(</span><span class="n">id</span> <span class="nb">INT</span><span class="p">,</span> <span class="n">name</span> <span class="n">STRING</span><span class="p">,</span> <span class="n">age</span> <span class="nb">INT</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">person</span> <span class="k">VALUES</span>
<span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s1">'Mary'</span><span class="p">,</span> <span class="k">NULL</span><span class="p">),</span>
<span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="s1">'John'</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
<span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="s1">'Mike'</span><span class="p">,</span> <span class="mi">80</span><span class="p">),</span>
<span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="s1">'Dan'</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="c1">--Select the first row in column age</span>
<span class="k">SELECT</span> <span class="k">FIRST</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">person</span><span class="p">;</span>
<span class="o">+</span><span class="c1">--------------------+</span>
<span class="o">|</span> <span class="k">first</span><span class="p">(</span><span class="n">age</span><span class="p">,</span> <span class="k">false</span><span class="p">)</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">--------------------+</span>
<span class="o">|</span> <span class="k">NULL</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">--------------------+</span>
<span class="c1">--Get the first row in column `age` ignore nulls,last row in column `id` and sum of column `id`.</span>
<span class="k">SELECT</span> <span class="k">FIRST</span><span class="p">(</span><span class="n">age</span> <span class="k">IGNORE</span> <span class="n">NULLS</span><span class="p">),</span> <span class="k">LAST</span><span class="p">(</span><span class="n">id</span><span class="p">),</span> <span class="k">SUM</span><span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">person</span><span class="p">;</span>
<span class="o">+</span><span class="c1">-------------------+------------------+----------+</span>
<span class="o">|</span> <span class="k">first</span><span class="p">(</span><span class="n">age</span><span class="p">,</span> <span class="k">true</span><span class="p">)</span> <span class="o">|</span> <span class="k">last</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="k">false</span><span class="p">)</span> <span class="o">|</span> <span class="k">sum</span><span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">-------------------+------------------+----------+</span>
<span class="o">|</span> <span class="mi">30</span> <span class="o">|</span> <span class="mi">400</span> <span class="o">|</span> <span class="mi">1000</span> <span class="o">|</span>
<span class="o">+</span><span class="c1">-------------------+------------------+----------+</span>
</code></pre></div></div>
<h3 id="related-statements">Related Statements</h3>
<ul>
<li><a href="sql-ref-syntax-qry-select.html">SELECT Main</a></li>
<li><a href="sql-ref-syntax-qry-select-where.html">WHERE Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-having.html">HAVING Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-orderby.html">ORDER BY Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-sortby.html">SORT BY Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-clusterby.html">CLUSTER BY Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-distribute-by.html">DISTRIBUTE BY Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-limit.html">LIMIT Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-offset.html">OFFSET Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-case.html">CASE Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-pivot.html">PIVOT Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-unpivot.html">UNPIVOT Clause</a></li>
<li><a href="sql-ref-syntax-qry-select-lateral-view.html">LATERAL VIEW Clause</a></li>
</ul>
</div>
<!-- /container -->
</div>
<script src="js/vendor/jquery-3.5.1.min.js"></script>
<script src="js/vendor/bootstrap.bundle.min.js"></script>
<script src="js/vendor/anchor.min.js"></script>
<script src="js/main.js"></script>
<script type="text/javascript" src="js/vendor/docsearch.min.js"></script>
<script type="text/javascript">
// DocSearch is entirely free and automated. DocSearch is built in two parts:
// 1. a crawler which we run on our own infrastructure every 24 hours. It follows every link
// in your website and extract content from every page it traverses. It then pushes this
// content to an Algolia index.
// 2. a JavaScript snippet to be inserted in your website that will bind this Algolia index
// to your search input and display its results in a dropdown UI. If you want to find more
// details on how works DocSearch, check the docs of DocSearch.
docsearch({
apiKey: 'd62f962a82bc9abb53471cb7b89da35e',
appId: 'RAI69RXRSK',
indexName: 'apache_spark',
inputSelector: '#docsearch-input',
enhancedSearchInput: true,
algoliaOptions: {
'facetFilters': ["version:4.1.0-preview1"]
},
debug: false // Set debug to true if you want to inspect the dropdown
});
</script>
<!-- MathJax Section -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
TeX: { equationNumbers: { autoNumber: "AMS" } }
});
</script>
<script>
// Note that we load MathJax this way to work with local file (file://), HTTP and HTTPS.
// We could use "//cdn.mathjax...", but that won't support "file://".
(function(d, script) {
script = d.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.onload = function(){
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ],
displayMath: [ ["$$","$$"], ["\\[", "\\]"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
}
});
};
script.src = ('https:' == document.location.protocol ? 'https://' : 'http://') +
'cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js' +
'?config=TeX-AMS-MML_HTMLorMML';
d.getElementsByTagName('head')[0].appendChild(script);
}(document));
</script>
</body>
</html>