Spłaszczenie danych i zapis bitowy

Odpowiedz Nowy wątek
2011-08-29 11:37
0

Cześć, mam takie dane:

employeeID | tID
----------------
    10     |  1
    11     |  1
    11     |  2

Zakładając, że tID to cyfra z zakresu <1,8>, chcę uzyskać coś takiego(kolumna tIDs została pokazana w postaci bitowej):

employeeID | tIDs
----------------------
    10     | 10000000
    11     | 11000000

Czyli każdy bit odpowiada odpowiedniej wartości tID.
Kolumna tIDs będzie oczywiście typu TINYINT, napisałem tak, żeby lepiej wyjaśnic o co mi chodzi.

Próbuję stworzyć zapytanie, które da mi takie dane, ale w żaden sposób mi to nie idzie. Ma ktoś jakiś pomysł?

Pozostało 580 znaków

2011-08-29 12:22
0

No i? chcesz bitowe OR zrobić na poziomie bazy grupując po employeeID.
CTE i do przodu :)

DECLARE @t TABLE (id INT, x tinyint);
 
INSERT INTO @t VALUES (10, 1);
INSERT INTO @t VALUES (11, 1);
INSERT INTO @t VALUES (11, 2);
INSERT INTO @t VALUES (11, 3);
INSERT INTO @t VALUES (11, 4);
 
WITH B (eid, nr, x) AS
(
    SELECT id, ROW_NUMBER() OVER (partition BY id ORDER BY id) AS nr, x FROM @t
),
C (eid, nr, bitsum) AS
(
    SELECT eid, nr, x FROM B WHERE nr = 1
    UNION ALL
    SELECT B.eid, B.nr, B.x | C.bitsum AS bitsum FROM C 
    INNER JOIN B ON C.eid = B.eid AND B.nr = C.nr + 1 
)
SELECT C.eid, C.bitsum FROM C
INNER JOIN (SELECT eid, MAX(nr) AS maxNr FROM C GROUP BY eid) AS D ON C.eid = D.eid AND C.nr = D.maxNr

Pozostało 580 znaków

2011-08-29 12:24
0

http://biblog.pl/?p=140 hint: custom aggregate function


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-08-29 13:07
0

Massther - nie wiem, co za dane dostaję, ale zupełnie inne niż powinienem.
MisiekD - nie ma innej opcji, tylko pisać własną funkcję agregującą?

[DOPISANE]

OK, wymyśliłem prostszy sposób, może nie tak elegancki jak propozycja Miśka, ale na moje potrzeby wystarczy:

SELECT employeeID, (MAX(bits & 1) + MAX(bits & 2)+MAX(bits & 4) + MAX(bits & 8) + MAX(bits & 16)
     + MAX(bits & 32) + MAX(bits & 64) + MAX(bits & 128)) AS tIDs
FROM
(
    SELECT DISTINCT employeeID, typeID, (128 / POWER(2, typeID-1)) AS bits
    FROM tab
) AS a
GROUP BY employeeID
edytowany 1x, ostatnio: Juhas, 2011-08-29 13:57
możesz jeszcze napisać stored proc, która będzie składała to rekord po rekordzie - Misiekd 2011-08-29 13:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0