zadanie sql - nie więcej niż 2 osoby w zespole

zadanie sql - nie więcej niż 2 osoby w zespole
Kyub
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Cześć, walczę z takim zadaniem:
Utwórz zespół NADMIAROWI. Czy można za pomocą jednego polecenia przenieść tam
pracowników z pozostałych zespołów w taki sposób, aby po wykonaniu polecenia w pozostałych
zespołach było nie więcej niż 2 osoby? Jeżeli tak, to czy da się ustalić w poleceniu lub poleceniach
jakiekolwiek kryterium, które to będą osoby?

Nie mam kompletnie pojęcia, jak mógłbym ograniczyć maksymalna ilość osób w zespołach (po za zespołem NADMIAROWI). Szperałem trochę w necie, ale nic nie znalazłem.

Napisałem coś takiego:

Kopiuj
--utworzenie zespolu NADMIAROWI
INSERT INTO zespoly(id_zesp, nazwa)
VALUES (
(SELECT MAX(id_zesp)+1 FROM zespoly),
'NADMIAROWI'
);

UPDATE pracownicy
SET
id_zesp = (
SELECT id_zesp FROM zespoly WHERE nazwa = 'NADMIAROWI')
WHERE id_zesp in 
(
SELECT * FROM
  (
    SELECT id_zesp
    FROM pracownicy
    GROUP BY id_zesp
    HAVING COUNT(*) >2
  )
);

UPDATE oczywiście przerzuca mi wszystkie osoby z zespołów, gdzie jest więcej niż 2 pracowników.

TABELA pracownicy:
screenshot-20210610125343.png

TABELA zespoly:
screenshot-20210610125436.png

Skrypt tworzący cała bazę:
http://wazniak.mimuw.edu.pl/images/4/48/Pracownicy.sql

Z góry dzięki za wszelkie sugestie :)

pzdr

UglyMan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2206
1

Możesz nadać rankiem numer pracownika w zespole (https://www.sqlpedia.pl/funkcja-rank-dense-rank/) i potem dla tych wszystkich, którzy mają rank wyższy niż 2 przenieść do nadmiarowych

Kyub
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

@UglyMan: Okej, wydaje się, że można to zrobić za pomocą ranka, ale jak to zaimplementować w zapytaniu? W jednym zapytaniu, próbuje wysmażyć jakieś zapytanie, ale nie mam pojęcia jak to zaimplementować:

Kopiuj
ALTER TABLE pracownicy
ADD id_rank int;

UPDATE pracownicy
SET id_rank =
(
    SELECT id_rank
    FROM
    (
        SELECT id_prac, RANK() OVER (ORDER BY id_zesp,id_rank) AS id_rank
        FROM pracownicy T
    ) D
    WHERE D.id_prac = pracownicy.id_prac
);


UPDATE pracownicy
SET
id_zesp = (
SELECT id_zesp FROM zespoly WHERE nazwa = 'NADMIAROWI')
WHERE id_rank > 2;


SELECT * FROM PRACOWNICY;
ROLLBACK

I to jest kilka zapytań, a nie jedno. Jak mógłbym ranka wrzucić w update?

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
1

Rank nie wiem czy jest odpowiedni, bo możesz mieć kilku pracowników na tej samej pozycji. Lepszy będzie row_number

Kopiuj
UPDATE pracownicy
SET
id_zesp = (
SELECT id_zesp FROM zespoly WHERE nazwa = 'NADMIAROWI')
WHERE id_prac in (select id_prac from (select id_prac,
Row_number() over (partition by id_zesp order by zatrudniony) r from pracownicy) where r > 2);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.