Хобрук: Ваш путь к мастерству в программировании

Группа SQL по битам установлена?

Есть ли способ сгруппировать результаты выбора по отдельным битам, установленным в столбце? То есть игнорирование комбинаций различных битов (иначе было бы достаточно простого group by column).

Например, если предположить, что таблица имеет значения от 1 до 10 для столбца группировки ровно один раз (представлено ниже с двоичным представлением для упрощения построения/проверки следующего результата оператора группировки):

 1 0001
 2 0010
 3 0011
 4 0100
 5 0101
 6 0110
 7 0111
 8 1000
 9 1001
10 1010

эффект группировки, которого я хочу добиться, будет выглядеть так:

select <bit>, count(*), group_concat(<column>) from <table> group by <...>

0    5    1,3,5,7,9
1    5    2,3,6,7,10
2    4    4,5,6,7
3    3    8,9,10

предполагая, что первый бит равен «бит 0».

В данный момент я использую MySQL, поэтому в идеале решение должно там работать; но я был бы заинтересован в других решениях RDBMS, если таковые имеются.

30.04.2018

Ответы:


1

Вам нужно будет разделить значения, а затем повторно агрегировать. Что-то вроде этого:

select n.n, group_concat(col1)
from t join
     (select 0 as n union all select 1 union all select 2 union all select 3
     ) n
     on (1 << n) & bits > 0
group by n;
30.04.2018
  • Что делает (1 ‹‹ n)? 30.04.2018
  • Это именно то, что я искал :) Чтобы упростить вариант использования со многими другими битами, я заменил внутренний выбор фактической таблицей со значениями 0-63 (также мог бы использовать представление). Спасибо! 30.04.2018
  • @P.Salmon 1<<n делает то же самое, что и в большинстве c-подобных языков программирования: сдвигает 1 влево на n, фактически то же самое, что и 2^n (2 в степени n). n исходит из значений 0, 1, 2, 3, сгенерированных внутренним выбором, который охватывает биты, которые меня интересовали, в моем примере из вопроса. Сдвиг необходим для создания bit-mask с помощью которого bitwise-and столбец, значения которого я пытаюсь сгруппировать. 30.04.2018
  • C не является одним из моих языков, но спасибо за объяснение - я никогда не сталкивался с его реализацией на языке, подобном sql. 30.04.2018
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..