37536
37536
<ul class="md-nav__list">
37537
37537
37538
37538
<li class="md-nav__item">
37539
- <a href="#solution-1" class="md-nav__link">
37539
+ <a href="#solution-1-using-window-functions " class="md-nav__link">
37540
37540
<span class="md-ellipsis">
37541
- Solution 1
37541
+ Solution 1: Using Window Functions
37542
37542
</span>
37543
37543
</a>
37544
37544
@@ -77696,7 +77696,7 @@ <h2 id="description">Description</h2>
77696
77696
<p><strong class="example">Example 1:</strong></p>
77697
77697
77698
77698
<pre>
77699
- <strong>Input:</strong>
77699
+ <strong>Input:</strong>
77700
77700
Accounts table:
77701
77701
+----+----------+
77702
77702
| id | name |
@@ -77718,13 +77718,13 @@ <h2 id="description">Description</h2>
77718
77718
| 1 | 2020-06-07 |
77719
77719
| 7 | 2020-06-10 |
77720
77720
+----+------------+
77721
- <strong>Output:</strong>
77721
+ <strong>Output:</strong>
77722
77722
+----+----------+
77723
77723
| id | name |
77724
77724
+----+----------+
77725
77725
| 7 | Jonathan |
77726
77726
+----+----------+
77727
- <strong>Explanation:</strong>
77727
+ <strong>Explanation:</strong>
77728
77728
User Winston with id = 1 logged in 2 times only in 2 different days, so, Winston is not an active user.
77729
77729
User Jonathan with id = 7 logged in 7 times in 6 different days, five of them were consecutive days, so, Jonathan is an active user.
77730
77730
</pre>
@@ -77737,7 +77737,10 @@ <h2 id="description">Description</h2>
77737
77737
<h2 id="solutions">Solutions</h2>
77738
77738
<!-- solution:start -->
77739
77739
77740
- <h3 id="solution-1">Solution 1</h3>
77740
+ <h3 id="solution-1-using-window-functions">Solution 1: Using Window Functions</h3>
77741
+ <p>First, we join the <code>Logins</code> table and the <code>Accounts</code> table, and remove duplicates to get the temporary table <code>T</code>.</p>
77742
+ <p>Then, we use the window function <code>ROW_NUMBER()</code> to calculate the base login date <code>g</code> for each user <code>id</code>. If a user logs in for 5 consecutive days, their <code>g</code> values are the same.</p>
77743
+ <p>Finally, we group by <code>id</code> and <code>g</code> to count the number of logins for each user. If the number of logins is greater than or equal to 5, then the user is considered active.</p>
77741
77744
<div class="tabbed-set tabbed-alternate" data-tabs="1:1"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">MySQL</label></div>
77742
77745
<div class="tabbed-content">
77743
77746
<div class="tabbed-block">
@@ -77753,19 +77756,43 @@ <h3 id="solution-1">Solution 1</h3>
77753
77756
<span class="normal">10</span>
77754
77757
<span class="normal">11</span>
77755
77758
<span class="normal">12</span>
77756
- <span class="normal">13</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">#</span><span class="w"> </span><span class="k">Write</span><span class="w"> </span><span class="n">your</span><span class="w"> </span><span class="n">MySQL</span><span class="w"> </span><span class="n">query</span><span class="w"> </span><span class="k">statement</span><span class="w"> </span><span class="n">below</span>
77757
- <span class="k">WITH</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">AS</span>
77758
- <span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="p">,</span>
77759
- <span class="w"> </span><span class="k">SUM</span><span class="p">(</span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="n">over</span><span class="p">(</span><span class="n">partition</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">id</span>
77760
- <span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">login_date</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="nb">interval</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="k">day</span><span class="w"> </span><span class="n">preceding</span><span class="p">)</span><span class="o">/</span><span class="n">id</span><span class="w"> </span><span class="n">cnt</span>
77761
- <span class="w"> </span><span class="k">FROM</span>
77762
- <span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="k">DISTINCT</span><span class="w"> </span><span class="o">*</span>
77763
- <span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">Accounts</span>
77764
- <span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="n">Logins</span><span class="w"> </span><span class="k">using</span><span class="p">(</span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="n">tt</span><span class="w"> </span><span class="p">)</span>
77765
- <span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="k">DISTINCT</span><span class="w"> </span><span class="n">id</span><span class="p">,</span>
77766
- <span class="w"> </span><span class="n">name</span>
77767
- <span class="k">FROM</span><span class="w"> </span><span class="n">t</span>
77768
- <span class="k">WHERE</span><span class="w"> </span><span class="n">cnt</span><span class="o">=</span><span class="mi">5</span><span class="p">;</span>
77759
+ <span class="normal">13</span>
77760
+ <span class="normal">14</span>
77761
+ <span class="normal">15</span>
77762
+ <span class="normal">16</span>
77763
+ <span class="normal">17</span>
77764
+ <span class="normal">18</span>
77765
+ <span class="normal">19</span>
77766
+ <span class="normal">20</span>
77767
+ <span class="normal">21</span>
77768
+ <span class="normal">22</span>
77769
+ <span class="normal">23</span>
77770
+ <span class="normal">24</span>
77771
+ <span class="normal">25</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">#</span><span class="w"> </span><span class="k">Write</span><span class="w"> </span><span class="n">your</span><span class="w"> </span><span class="n">MySQL</span><span class="w"> </span><span class="n">query</span><span class="w"> </span><span class="k">statement</span><span class="w"> </span><span class="n">below</span>
77772
+ <span class="k">WITH</span>
77773
+ <span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span>
77774
+ <span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="k">DISTINCT</span><span class="w"> </span><span class="o">*</span>
77775
+ <span class="w"> </span><span class="k">FROM</span>
77776
+ <span class="w"> </span><span class="n">Logins</span>
77777
+ <span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="n">Accounts</span><span class="w"> </span><span class="k">USING</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="p">)</span>
77778
+ <span class="w"> </span><span class="p">),</span>
77779
+ <span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span>
77780
+ <span class="w"> </span><span class="k">SELECT</span>
77781
+ <span class="w"> </span><span class="o">*</span><span class="p">,</span>
77782
+ <span class="w"> </span><span class="n">DATE_SUB</span><span class="p">(</span>
77783
+ <span class="w"> </span><span class="n">login_date</span><span class="p">,</span>
77784
+ <span class="w"> </span><span class="nb">INTERVAL</span><span class="w"> </span><span class="n">ROW_NUMBER</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span>
77785
+ <span class="w"> </span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">id</span>
77786
+ <span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">login_date</span>
77787
+ <span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">DAY</span>
77788
+ <span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">g</span>
77789
+ <span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">T</span>
77790
+ <span class="w"> </span><span class="p">)</span>
77791
+ <span class="k">SELECT</span><span class="w"> </span><span class="k">DISTINCT</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">name</span>
77792
+ <span class="k">FROM</span><span class="w"> </span><span class="n">P</span>
77793
+ <span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="k">g</span>
77794
+ <span class="k">HAVING</span><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span>
77795
+ <span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
77769
77796
</code></pre></div></td></tr></table></div>
77770
77797
</div>
77771
77798
</div>
0 commit comments