- About SQL Fiddle
- Who should I contact for help/feedback?
- What am I supposed to do here?
- How does it work?
- What differences are there between the various database options?
- What’s up with that [ ; ] button under each panel?
- Why are there two strange-looking options for SQLite?
- Who built this site, and why?
- How is the site paid for?
- Source Code
- What platform is it running on?
- Sqlfiddle.com не работает сегодня?
- Sqlfiddle.com сбои за последние 24 часа
- Не работает Sqlfiddle.com?
- Что не работает?
- Что делать, если сайт SQLFIDDLE.COM недоступен?
- SQL для аналитики — рейтинг прикладных задач с решениями
- Конкатенация значений из нескольких строк в одну через разделитель
- Аналитические функции при сохранении всех строк выборки
- Работа с NULL и применение логики ветвления IF-THEN-ELSE в SQL
- Дедупликация данных
- Анализ временных рядов
- Анализ истории со Slowly Changing Dimensions (SCD)
- Использование выражения CASE в агрегирующих функциях
- Парсинг колонки с разделением на отдельные атрибуты
- FULL JOIN для соединений без потери строк
- Разбиение пользовательских событий на сессии
- В реальном мире всё сложнее
About SQL Fiddle
A tool for easy online testing and sharing of database problems and their solutions.
Who should I contact for help/feedback?
There are two ways you can get in contact:
What am I supposed to do here?
If you do not know SQL or basic database concepts, this site is not going to be very useful to you. However, if you are a database developer, there are a few different use-cases of SQL Fiddle intended for you:
You want help with a tricky query, and you’d like to post a question to a Q/A site like StackOverflow . Build a representative database (schema and data) and post a link to it in your question. Unique URLs for each database (and each query) will be generated as you use the site; just copy and paste the URL that you want to share, and it will be available for anyone who wants to take a look. They will then be able to use your DDL and your SQL as a starting point for answering your question. When they have something they’d like to share with you, they can then send you a link back to their query.
You want to compare and contrast SQL statements in different database back-ends. SQL Fiddle easily lets you switch which database provider (MySQL, PostgreSQL, MS SQL Server, Oracle, and SQLite) your queries run against. This will allow you to quickly evaluate query porting efforts, or language options available in each environment.
You do not have a particular database platform readily available, but you would like to see what a given query would look like in that environment. Using SQL Fiddle, you don’t need to bother spinning up a whole installation for your evaluation; just create your database and queries here!
How does it work?
The Schema DDL that is provided is used to generate a private database on the fly. If anything is changed in your DDL (even a single space!), then you will be prompted to generate a new schema and will be operating in a new database.
All SQL queries are run within a transaction that gets immediately rolled-back after the SQL executes. This is so that the underlying database structure does not change from query to query, which makes it possible to share anonymously online with any number of users (each of whom may be writing queries in the same shared database, potentially modifying the structure and thus — if not for the rollback — each other’s results).
As you create schemas and write queries, unique URLs that refer to your particular schema and query will be visible in your address bar. You can share these with anyone, and they will be able to see what you’ve done so far. You will also be able to use your normal browser functions like ‘back’, ‘forward’, and ‘reload’, and you will see the various stages of your work, as you would expect.
What differences are there between the various database options?
Aside from the differences inherent in the various databases, there are a few things worth pointing out about their implementation on SQL Fiddle.
MySQL only supports queries which read from the schema (selects, basically). This is necessary due to some limitations in MySQL that make it impossible for me to ensure a consistent schema while various people are fiddling with it. The other database options allow the full range of queries that the back-end supports.
SQLite runs in the browser; see below for more details.
What’s up with that [ ; ] button under each panel?
This obscure little button determines how the queries in each of the panels get broken up before they are sent off to the database. This button pops open a dropdown that lists different «query terminators.» Query terminators are used as a flag to indicate (when present at the end of a line) that the current statement has ended. The terminator does not get sent to the database; instead, it merely idicates how I should parse the text before I execute the query.
Oftentimes, you won’t need to touch this button; the main value this feature will have is in defining stored procedures. This is because it is often the case that within a stored procedure’s body definition, you might want to end a line with a semicolon (this is often the case). Since my default query terminator is also a semicolon, there is no obvious way for me to see that your stored procedure’s semicolon isn’t actually the end of the query. Left with the semicolon terminator, I would break up your procedure definition into incorrect parts, and errors would certainly result. Changing the query terminator to something other than a semicolon avoids this problem.
Why are there two strange-looking options for SQLite?
SQLite is something of a special case amongst the various database types I support. I could have implemented it the same way as the others, with a backend host doing the query execution, but what fun is that? SQLite’s «lite» nature allowed for some interesting alternatives.
First, I found the very neat project SQL.js , which is an implementation of the engine translated into javascript. This means that instead of using my servers (and my limited memory), I could offload the work onto your browser! Great for me, but unfortunately SQL.js does have a few drawbacks. One is that it taxes the browser a bit when it is first loaded into memory. The other is that it doesn’t work in all browsers (so far I’ve seen it fail in IE9 and mobile Safari).
The other option is «WebSQL.» This option makes use of the SQLite implementation that a few browsers come with built-in (I’ve seen it work in Chrome and Safari; supposedly Opera supports this too). This feature was considered part of the W3C working draft for HTML5 , but they depricated it in favor of IndexedDB . Despite this, a few browsers (particularly mobile browsers) still have it available, so I figured that this would be a useful feature to grab onto. The advantage over SQL.js is that it is quite a bit faster to load the schema and run the queries. The disadvantage is that it isn’t widely supported, and likely not long for this world.
Together, these two options allow SQLite to run within any decent browser *cough*IE*cough*. If someone links you to a SQLite fiddle that your browser doesn’t support, just switch over to the other option and build it using that one. If neither works, then get a better browser.
Who built this site, and why?
SQLFiddle.com was built by Jake Feasel , a web developer originally from Anchorage, Alaska and now living in Vancouver, WA. He started developing the site around the middle of January, 2012.
He had been having fun answering questions on StackOverflow, particularly related to a few main categories: ColdFusion , jQuery , and SQL .
He found JS Fiddle to be a great tool for answering javascript / jQuery questions, but he also found that there was nothing available that offered similar functionality for the SQL questions. So, that was his inspiration to build this site. Basically, he built this site as a tool for developers like me to be more effective in assisting other developers.
How is the site paid for?
ZZZ Projects started to pay for the hosting in 2017 before taking the ownership in 2018. We have some great plan to make SQL Fiddle even more friendly user, and we welcome any contribution.
Source Code
If you are interested in the fine details of the code behind SQL Fiddle and exactly how it is deployed, it is all available on github
What platform is it running on?
This site uses many different technologies. The primary ones used to provide the core service, in order from client to server are these:
| Title | Description |
|---|---|
| RequireJS js | JavaScript module loader and code optimizer. |
| CodeMirror js | For browser-based SQL editing with text highlighting. |
| Bootstrap css | Twitter’s CSS framework (v2). |
| LESS css | CSS pre-processor. |
| Backbone.js js | MV* JavaScript framework. |
| Handlebars.js js | JavaScript templating engine. |
| Lodash.js js | Functional programming library for Javascript. |
| Date.format.js js | Date formatting JavaScript library. |
| jQuery js | AJAX, plus misc JS goodness. (Also jq plugins Block UI and Cookie ). |
| html-query-plan js | XSLT for building rich query plans for SQL Server. |
| Varnish backend | Content-caching reverse proxy. |
| Vert.x backend | Open Source Java-based Application Server. |
| PostgreSQL db | Among others, of course, but PG is the central database host for this platform. |
| Grunt devops | Javascript task runner, config and frontend build automation. |
| Maven devops | Dependency management, backend build automation. |
| Docker devops | VM management. |
| Amazon AWS hosting | Cloud Hosting Provider. |
| GitHub devops hosting | Git repository, collaboration environment. |
This list doesn’t include the stacks used to run the database engines. Those are pretty standard installs of the various products. For example, I’m running a Windows 2008 VPS running SQL Server 2014 and Oracle, and various Docker images running the others.
Источник
Sqlfiddle.com не работает сегодня?
Узнайте, работает ли Sqlfiddle.com в нормальном режиме или есть проблемы сегодня
Sqlfiddle.com сбои за последние 24 часа
Не работает Sqlfiddle.com?
Не открывается, не грузится, не доступен, лежит или глючит?
Что не работает?
Самые частые проблемы Sqlfiddle.com
Что делать, если сайт SQLFIDDLE.COM недоступен?
Если SQLFIDDLE.COM работает, однако вы не можете получить доступ к сайту или отдельной его странице, попробуйте одно из возможных решений:
Кэш браузера.
Чтобы удалить кэш и получить актуальную версию страницы, обновите в браузере страницу с помощью комбинации клавиш Ctrl + F5.
Блокировка доступа к сайту.
Очистите файлы cookie браузера и смените IP-адрес компьютера.
Антивирус и файрвол. Проверьте, чтобы антивирусные программы (McAfee, Kaspersky Antivirus или аналог) или файрвол, установленные на ваш компьютер — не блокировали доступ к SQLFIDDLE.COM.
VPN и альтернативные службы DNS.
VPN: например, мы рекомендуем NordVPN.
Альтернативные DNS: OpenDNS или Google Public DNS.
Плагины браузера.
Например, расширение AdBlock вместе с рекламой может блокировать содержимое сайта. Найдите и отключите похожие плагины для исследуемого вами сайта.
Сбой драйвера микрофона
Быстро проверить микрофон: Тест Микрофона.
Источник
SQL для аналитики — рейтинг прикладных задач с решениями
Привет, Хабр! У кого из вас black belt на sql-ex.ru, признавайтесь? На заре своей карьеры я немало времени провел на этом сайте, практикуясь и оттачивая навыки. Должен отметить, что это было увлекательное и вознаграждающее путешествие. Пришло время воздать должное.
В этой публикации я собрал топ прикладных задач и мои подходы к их решению в терминах SQL. Каждая задача снабжена кусочком данных и кодом, с которым можно интерактивно поиграться на SQL Fiddle.
SQL is intergalactic data speak. SQL — это межгалактический язык данных
Моя цель — показать подходы и самые распространенные проблемы на понятных и доступных примерах. Конечно, СУБД, на которой решается задача имеет значение. Поддержка функций и синтаксиса варьируется. В SQL Fiddle я задействовал PostgreSQL, Oracle, SQL Server. Для решения серьезных аналитических задач сегодня я чаще всего использую специальные СУБД, такие как Redshift, Vertica, BigQuery, Clickhouse, Snowflake.
Уверен, неискушенные пользователи смогут многое для себя почерпнуть. Продвинутых же пользователей призываю поделиться своими наиболее интересными задачами и поучаствовать в обсуждении.
Конкатенация значений из нескольких строк в одну через разделитель
Когда это может быть полезно? К примеру, если исходный набор данных хранит каждый тег, присвоенный сделке, в отдельной строке (это же получится при соединении таблиц лидов и тегов), и есть необходимость собрать все теги, обойдясь при этом без дублирования строк по каждой сделке.
Формулировка задачи: Для каждого лида вывести список тегов, разделенных запятой в одном столбце
Аналитические функции при сохранении всех строк выборки
Речь пойдет о так называемых analytic functions, которые оперируют над партициями данных (окна, windows), возвращая результат для каждой строки. В отличие от aggregate functions, “схлопывающих” строки, оконные функции оставляют все строки выборки.
Окно определяется спецификацией (выражение OVER) и основывается на трех основных концепциях:
Разбиение строк на группы (выражение PARTITION BY)
Порядок сортировки строк в каждой группе (выражение ORDER BY)
Рамки, которые определяют ограничения по количеству строк относительно каждой строки (выражение ROWS)
Таких функций существует немало, от аналитических: всем известные SUM, AVG, COUNT, менее известные LAG, LEAD, CUMEDIST, и до ранжирующих: RANK, ROWNUMBER, NTILE. Я же приведу несколько простых примеров часто встречающихся запросов:
Ко всем транзакциям пользователя вывести дату первой покупки
К каждой транзакции добавить дату предыдущей транзакции пользователя
Показать сумму покупок пользователя нарастающим итогом
Присвоить всем транзакциям пользователя / продавца / отделения порядковый номер
Работа с NULL и применение логики ветвления IF-THEN-ELSE в SQL
Про COALESCE / NVL знают все, и нет смысла останавливаться на них подробно. Зато с NVL2 и NULLIF знакомы уже не так много людей.
NULLIF сравнивает два значения и возвращает NULL, если аргументы равны. По сути эта функция — обратна к NVL / COALESCE. Формулировка задачи:
Как обработать ошибку деления на 0 (divide by zero error)
Как выводить NULL вместо пустых строк (‘’)
NVL2 в свою очередь вернет одно из значений, в зависимости от того, является ли входной аргумент NULL или NOT NULL. Например, если в таблице транзакций есть ссылка на invoiceid, значит транзакция в сегменте B2B, и ее следует пометить соответствующим образом.
Но больше всего мне нравится функция DECODE. Она в буквальном смысле позволяет расшифровать значения согласно заданной вами логике:
DECODE ( expression, search, result [, search, result ]… [ ,default ] ).
Формулировка задачи: Присвоить численному коду (или, например, битовой маске) текстовые наименования.
Опережая вопрос, конечно, эту же логику можно выразить через всем известное выражение CASE. Задача показать что-то интересное, и чем меньше кода — тем красивее, на мой взгляд.
Дедупликация данных
Это классика. Задачу часто спрашивают на собеседованиях в формулировке “как удалить дубли / копии строк”, и решить ее можно несколькими способами. Я привык мыслить в терминах историзации данных в Хранилище, и удаление мне ни к чему, поэтому для решения задачи я воспользуюсь ранжирующей функцией ROWNUMBER().
Формулировка задачи: Выбрать самую актуальную запись с учетом статуса (успешная / отмененная транзакция) и временнОй метки
Некоторые СУБД, например, Teradata позволяют сделать запрос короче при помощи выражения QUALIFY:
Анализ временных рядов
Просто не могу обойти это стороной. ВременнАя шкала — это, безусловно, одно из наиболее часто используемых измерений. Отчетность зачастую строится вокруг измерения метрик и их динамики относительно периодов: неделя, месяц, время суток и т.д.
Замечательно, если ваша BI система умеет работать с различными абсолютными и относительными фреймами, и наружу выставляет красивый визуальный интерфейс. Еще лучше, если в ваш инструментарий аналитика входит пара наиболее используемых функций:
Получение текущей даты (+ время) — CURRENTDATE, CURRENTTIMESTAMP
Разница между событием и текущим временем — DATEDIFF
Подсчет времени истечения срока действия события — DATEADD
Дата начала недели, в которой произошло событие — DATETRUNC
Конвертация Unix Timestamp (epoch) в человекочитаемый формат
Анализ истории со Slowly Changing Dimensions (SCD)
В основе Хранилища Данных лежит принцип историзации. Иначе говоря — это возможность получить состояние той или иной сущности на определенный момент времени, а также проследить цепочку событий и изменений атрибутов и показателей. Существует несколько способов организации хранения истории. Один из наиболее популярных подходов — запись новой строки на любое изменение атрибутного состава, с указанием даты начала и окончания действия каждой строки. Есть несколько задач, с которыми вы с большой долей вероятности можете встретиться.
Формулировка задачи: Какой статус был у клиентов на 3-й день месяца?
Формулировка задачи: Как в течение недели росло количество активных клиентов?
С помощью такого подхода можно подсчитать долю неактивных контрагентов на каждую дату за последний месяц. При этом неактивным считается контрагент, не совершивший ни одной транзакции за предыдущие 7 дней на каждую дату. Вот так может выглядеть визуализация решения задачи на дашборде:
Использование выражения CASE в агрегирующих функциях
Агрегирующие функции могут принимать в качестве аргумента результат оценки выражения CASE. Таким образом можно к агрегируемым строкам применить псевдофильтр. Это напоминает мне использование формулы СУММЕСЛИ из старого доброго Excel, только для реляционных баз данных. Смотрите сами:
Подсчитать все лиды и выручку
Подсчитать количество лидов со статусом success
Подсчитать выручку лидов с тегом python
Парсинг колонки с разделением на отдельные атрибуты
Чаще всего так поступают в условиях внешних ограничений, когда иного выхода нет. Например, при ограниченном наборе полей в CRM системе. Или при передаче нескольких UTM-меток в одной строковой переменной. Еще так могут делать люди, которые не слышали про нормализацию данных.
Формулировка задачи: Выделить закодированные в названии кампании атрибуты в отдельные колонки: сеть, регион, категория, температура, бренд.
Чуть более сложная ситуация с парсингом UTM-меток, а именно UTMContent, которая по сути является контейнером для произвольного набора атрибутов, разделенных любым символом. Поэтому стоит быть последовательным и аккуратным при формировании таких меток, хотя зачастую инженер вынужден работать с тем, что есть.
Формулировка задачи: Разбить строку UTMContent на отдельные атрибуты cid, gid, aid, kwd с соблюдением соответствия ключ-значение. Каждое значение предваряется наименованием ключа, все значения разделены вертикальной строкой (|).
FULL JOIN для соединений без потери строк
Уверен, что все знают про FULL JOIN, но кто хоть иногда использует этот тип соединения? Это незаменимый подход в ситуациях, когда я хочу сохранить все исходные строки с каждой стороны джоина. Иначе говоря, недопустимо терять факты трат денежных средств, даже если для них не нашлось соответствующих лидов в таблицах CRM.
А теперь представьте ситуацию, когда таблиц больше двух. Это может быть веб-аналитика, выгрузки из рекламных кабинетов, CRM. В этом случае я дополнительно формирую мета-колонки isrowmatched (нашлось ли совпадение — да / нет) и roworigin (источник данных для конкретной строки).
Формулировка задачи: Подготовить витрину-трекер для сквозной аналитики лидов из CRM и трат из Рекламных Кабинетов (Яндекс.Директ, Google Adwords, Facebook).
Пример упрощен и умозрителен. Однако этой задаче я посвятил одну из своих предыдущих публикаций: Сквозная Аналитика на Azure SQL + dbt + Github Actions + Metabase и недавнее выступление на вебинаре: Путь Инженера Аналитики: Решение для Маркетинга. Тема заслуживает отдельного внимания.
Разбиение пользовательских событий на сессии
Сессионизация — весьма интересная и сложная задача, сочетающая в себе сразу комплекс инженерных и аналитических решений. С ростом популярности и востребованности всевозможных трекеров, таких как Google Analytics, Snowplow, Amplutide кратно возрастает спрос на решение подобного рода задач.
Для чего это можно использовать? Прежде всего, для того, чтобы перейти от анализа хитов (кликов) к полноценному анализу пользовательского взаимодействия и поведения. Во-вторых, улучшение UX и качества сервисов, проведение A/B тестирования. Наконец, поиск паттернов, определенных сегментов пользователей, в том числе fraud monitoring (защита от мошенничества и ботов).
Чуть подробнее про дефиницию сессии от Google Analytics: How a web session is defined in Universal Analytics. Резюмируя, сессия — это набор пользовательских действий в рамках заданного промежутка времени. Сессия завершается при следующих событиях:
30 минут бездействия
Начало новых суток
Смена источника трафика (возврат на сайт по клику на новый рекламный баннер)
Базовая задача сессионизации сводится к следующему: превратить последовательность кликов из лога веб-сервера в набор сессий.
Попробуем декомпозировать и решить задачу по частям:
Шаг 1. Для каждого пользователя берем идентификатор просмотра, время просмотра, источник трафика (хеш-сумма). Хеш-сумма берется от текстовой конкатенации атрибутов источника трафика: utm_source + utm_medium + utm_campaign. При этом обрабатываются null-значения в любом из столбцов (заменяются на литерал ‘null’). По хеш-сумме легко проверить смену источника трафика.
Шаг 2. Для каждого хита выводим предыдущий хит и соответствующее ему время. Окно — по пользователю, сортировка по времени хита:
Шаг 3. Рассчитываем, является ли каждый хит началом новой сессии. Это проверка на выполнение любого из трех указанных выше условий окончания сессии:
Шаг 4. Присваиваем каждой сессии уникальный идентификатор. Для этого сначала необходимо пронумеровать сессии одного пользователя монотонно возрастающими числами. Затем построить уникальный суррогатный ключ сессии: к номеру сессии добавить идентификатор пользователя, взять хеш-сумму:
В реальном мире всё сложнее
Помимо логики, выраженной в SQL, не меньшее значение имеет ряд других факторов:
СУБД, с которой вы работаете: то, какие функции и возможности она поддерживает, формат хранения данных: в виде колонок или строк
Фактически используемый план выполнения запроса: алгоритмы соединения таблиц, локальность операций, наличие статистических данных у оптимизатора
Используемые физические и логические модели данных: индексы, материализованные представления, кеш, предварительно отсортированные данные
На занятиях курса Data Engineer я и мои коллеги готовим объемлющий и интересный контент, затрагивающий множество тем, связанных с архитектурой аналитических приложений, внутренним устройством систем обработки больших данных и развертыванием ML.
Советую посетить ближайшие открытые вебинары:
Оставляйте ваши комментарии и вопросы, предлагайте собственные примеры задач и подходы к решению.
Источник