sql >> Database >  >> RDS >> Sqlserver

Hamming-gewicht/populatietelling in T-SQL

U kunt een helpertabel gebruiken met vooraf berekende Hamming-gewichten voor kleine getallen, zoals bytes, en de waarde dienovereenkomstig splitsen, aansluiten bij de helpertabel en de som van gedeeltelijke Hamming-gewichten krijgen als het Hamming-gewicht van de waarde:

-- 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. Waarom kan ik geen alias gebruiken in een DELETE-instructie?

  2. MySQL debugging tool trage queries?

  3. Inleiding tot FORALL-instructie in Oracle Database

  4. Updatequery mislukt met fout:1175