<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Greg Zemskov</title><generator>teletype.in</generator><description><![CDATA[Greg Zemskov]]></description><image><url>https://teletype.in/files/6e/b3/6eb3f38e-b0b2-4722-a817-f16186928691.jpeg</url><title>Greg Zemskov</title><link>https://teletype.in/@gregzem</link></image><link>https://teletype.in/@gregzem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=gregzem</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/gregzem?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/gregzem?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 15 Apr 2026 14:31:54 GMT</pubDate><lastBuildDate>Wed, 15 Apr 2026 14:31:54 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@gregzem/bYz3Bw1Wwuk</guid><link>https://teletype.in/@gregzem/bYz3Bw1Wwuk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=gregzem</link><comments>https://teletype.in/@gregzem/bYz3Bw1Wwuk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=gregzem#comments</comments><dc:creator>gregzem</dc:creator><title>SQL: Сравниваем значения на временном интервале</title><pubDate>Wed, 23 Jun 2021 15:18:53 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/4c/ef/4cef253d-dc2f-4868-b833-eab2819030c1.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/a8/14/a814ee86-c70f-4be7-b3da-5ac781fc39e9.png"></img>Довольно часто при анализе данных требуется сравнить значения с предыдущими на некотором интервале. Например, сравнить динамику посещений сайта по дням по сравнению с тем, что было год назад. (То есть мы сравниваем значения 22-07-2021 и 22-07-2020, 23-07-2021 и 23-07-2020 и т.д.) Или сравнить прибыль по дням в текущем и прошлом месяцах. Или среднюю нагрузку сайта по часам в будни и в выходные. В общем, применений - масса, пользы - достаточно. 
Данные выбираются достаточно несложным JOIN'ом, но чтобы вам не тратить время, приведу его готовый в виде шаблона с плейсхолдерами. ]]></description><content:encoded><![CDATA[
  <p>Довольно часто при анализе данных требуется сравнить значения с предыдущими на некотором интервале. Например, сравнить динамику посещений сайта по дням по сравнению с тем, что было год назад. (То есть мы сравниваем значения 22-07-2021 и 22-07-2020, 23-07-2021 и 23-07-2020 и т.д.) Или сравнить прибыль по дням в текущем и прошлом месяцах. Или среднюю нагрузку сайта по часам в будни и в выходные. В общем, применений - масса, пользы - достаточно. <br />Данные выбираются достаточно несложным JOIN&#x27;ом, но чтобы вам не тратить время, приведу его готовый в виде шаблона с плейсхолдерами. </p>
  <p>Для Clickhouse:</p>
  <pre>SELECT
  date_sub(YEAR, 1, toDate( {{dt}} )) as prev_{{dt}},
  toDate( {{dt}} ) as cur_{{dt}},
  prev_{{value}},
  {{value}} as cur_{{value}},
  {{value}} - prev_{{value}} as diff_{{value}}
FROM
  {{table}}
  JOIN (
    SELECT
      toDate( {{dt}} ) as another_{{dt}},
      {{value}} as prev_{{value}}
    FROM
      {{table}}
    WHERE toDate( {{dt}} ) &gt;= &#x27;2020-01-01&#x27; and toDate( {{dt}} ) &lt; &#x27;2021-01-01&#x27;
  ) t2
  ON toDate(prev_{{dt}}) = another_{{dt}}</pre>
  <p>Для SQLite3:</p>
  <pre>SELECT
  strftime(&quot;%d-%m&quot;, {{dt}}) as cmp_{{dt}}, 
  date({{dt}}, &#x27;-12 month&#x27;) as prev_{{dt}},
  prev_{{value}},
  {{value}},
  {{value}} - prev_{{value}} as diff_{{value}}
FROM
  {{table}} t1
  JOIN (
    SELECT
      {{dt}} as another_{{dt}},
      {{value}} as prev_{{value}}
    FROM
      {{table}}
    WHERE toDate( {{dt}} ) &gt;= &#x27;2020-01-01&#x27; and toDate( {{dt}} ) &lt; &#x27;2021-01-01&#x27;
  ) t2
  ON prev_{{dt}} = another_{{dt}}
	</pre>
  <p>Замените </p>
  <ul>
    <li><strong>{{dt}}</strong> на имя поля, содержащее дату</li>
    <li><strong>{{value}}</strong> на имя поля, содержащее значение, для которого мы выполняем сравнение</li>
    <li><strong>{{table}}</strong> на имя таблицы, откуда тянем данные</li>
  </ul>
  <p>По сути, у запроса есть два параметра:<br />1. анализируемый интервал, за который мы смотрим разницу в значениях<br />2. диапазон дат, в рамках которого мы смотрим значения</p>
  <p><strong>#1</strong> задается функцией <strong>date_sub(YEAR, 1, toDate( {{dt}} ))</strong> для Clickhouse и <strong>date({{dt}}, &#x27;-12 month&#x27;)</strong> для SQLite.<br />Здесь можно указать, разницу между анализируемыми датами. Например, чтобы сравнить значения в интервале 1 месяца, нужно поменять параметры этих функций на <strong>date_sub(MONTH, 1, toDate( {{dt}} ))</strong> и <strong>date({{dt}}, &#x27;-1 month&#x27;) </strong>соответственно.</p>
  <p><strong>#2</strong> задается условием <strong>WHERE toDate( {{dt}} ) &gt;= &#x27;2020-01-01&#x27; and toDate( {{dt}} ) &lt; &#x27;2021-01-01&#x27;</strong>. Просто поменяйте интервал (это интервал предыдущего диапазона).</p>
  <p>И еще, чтобы на графике все выглядело &quot;комильфо&quot;, можно первым параметром сделать вывод значения, которое будет общим для интервалов. Например, если мы сравниваем по дням, то в SELECT для SQLite мы добавим <strong>strftime(&quot;%d-%m&quot;, {{dt}}) as cmp_{{dt}}</strong>, то есть будет выводится день и месяц (а год у нас отбрасывается, потому что мы сравниваем по годам).</p>
  <p>Пример того, как оно может выглядеть:<br /></p>
  <figure class="m_original">
    <img src="https://teletype.in/files/a8/14/a814ee86-c70f-4be7-b3da-5ac781fc39e9.png" width="1920" />
  </figure>

]]></content:encoded></item></channel></rss>