Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Тегло на Хеминг/преброяване на населението в T-SQL

Можете да използвате помощна таблица с предварително изчислени тегла на Хеминг за малки числа, като байтове, след което да разделите стойността съответно, да се присъедините към помощната таблица и да получите сумата от частичните тегла на Хеминг като тегло на Хеминг на стойността:

-- define Hamming weight helper table
DECLARE @hwtally TABLE (byte tinyint, hw int);
INSERT INTO @hwtally (byte, hw) VALUES (0, 0);
INSERT INTO @hwtally (byte, hw) SELECT   1 - byte, 1 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT   3 - byte, 2 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT   7 - byte, 3 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  15 - byte, 4 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  31 - byte, 5 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT  63 - byte, 6 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT 127 - byte, 7 - hw FROM @hwtally;
INSERT INTO @hwtally (byte, hw) SELECT 255 - byte, 8 - hw FROM @hwtally;

-- calculate
WITH split AS (
  SELECT SUBSTRING(@value, number, 1) AS byte
  FROM master.dbo.spt_values
  WHERE type = 'P' AND number BETWEEN 1 AND LEN(@value)
)
SELECT
  Value = @value,
  HammingWeight = SUM(t.hw)
FROM split s
  INNER JOIN @hwtally t ON s.byte = t.byte


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL. SP или функцията трябва да изчисли следващата дата за петък

  2. SQL Server ИЗБЕРЕТЕ ПОСЛЕДНИ N реда

  3. Как мога да променя тази изчислена колона в SQL Server 2008?

  4. Заявка с оптимална ефективност за най-нов запис за всеки N

  5. 3 начина за връщане на броя на редовете във всеки дял в SQL Server (T-SQL)