Есть таблица A с тремя колонками B, C, D. Типы колонок — varchar2(10). В таблице нет никаких индексов, констрейнтов. Необходимо написать наиболее оптимизированный скрипт удаления в таблице дублей (повторений всех трех колонок). Результат удаления скрипта — в таблице должны остаться только неповторяющиеся записи.
1. Создание таблицы A:
CREATE TABLE A (
B VARCHAR(10),
C VARCHAR(10),
D VARCHAR(10)
);2. Вставка произвольных данных в таблицу A:
INSERT INTO a (b, c, d) VALUES ('Иван', 'Иванов', '1234');
INSERT INTO a (b, c, d) VALUES ('Мария', 'Петрова', '5678');
INSERT INTO a (b, c, d) VALUES ('Дмитрий', 'Лебедев', '5566');
INSERT INTO a (b, c, d) VALUES ('Алексей', 'Смирнов', '9876');
INSERT INTO a (b, c, d) VALUES ('Сергей', 'Кузнецов', '1122');
INSERT INTO a (b, c, d) VALUES ('Елена', 'Ковалёва', '3344');
INSERT INTO a (b, c, d) VALUES ('Иван', 'Иванов', '1234'); -- Дубликат
INSERT INTO a (b, c, d) VALUES ('Иван', 'Иванов', '1234'); -- Дубликат
INSERT INTO a (b, c, d) VALUES ('Алексей', 'Смирнов', '9876'); -- Дубликат
INSERT INTO a (b, c, d) VALUES ('Сергей', 'Кузнецов', '1122'); -- Дубликат⠀
3. Написание запроса - запрос на удаление в таблице дублей (повторений всех трех колонок):
DELETE FROM a
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM a
GROUP BY b, c, d
);4. Написание js-скрипта:
const { Pool } = require('pg');
(async () => {
const pool = new Pool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'task1',
port: 5432,
});
try {
console.log('Подключение установлено.');
const deleteDuplicates = `
DELETE FROM a
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM a
GROUP BY b, c, d
);
`;
const result = await pool.query(deleteDuplicates);
console.log(`Дубли удалены. Количество удаленных строк: ${result.rowCount}`);
} catch (error) {
console.error('Ошибка при выполнении операции:', error.message);
} finally {
await pool.end();
console.log('Соединение закрыто.');
}
})();Тестирование шагов 3-4. Работа программы и результат ее работы представлен на рисунках 2-3.
Ожидаемый результат работы программы:
Иван Иванов 1234
Мария Петрова 5678
Алексей Смирнов 9876
Сергей Кузнецов 1122
Елена Ковалева 3344
Дмитрий Лебедев 5566
⠀
Есть две таблицы A и B. В каждой таблице есть колонка C. Составьте запрос так, чтобы результатом запроса стала выборка непересекающегося множества значений колонки C из таблиц A и B.
1. Создание таблицы B:
CREATE TABLE B (
D VARCHAR(10),
C VARCHAR(10),
E VARCHAR(10)
);2. Вставка произвольных данных в таблицу B:
insert into b (d, c, e) values ('Иван', 'Иванов', '1234');
insert into b (d, c, e) values ('Иван', 'Петров', '5679');
insert into b (d, c, e) values ('Алексей', 'Алексеев', '9221');
insert into b (d, c, e) values ('Дмитрий', 'Медведев', '9101');
insert into b (d, c, e) values ('Евгений', 'Евгеньев', '3344');
insert into b (d, c, e) values ('Егор', 'Лебедев', '3344');⠀
3. Написание запроса - запрос на выборку непрекасающегося множества значений колонки C из таблиц A и B:
SELECT C
FROM A
WHERE C NOT IN (SELECT C FROM B)
UNION
SELECT C
FROM B
WHERE C NOT IN (SELECT C FROM A)
ORDER BY C;Тестирование шага 3. Результат работы скрипта представлен на рисунке 5.
Ожидаемый результат:
Петров
Петрова
Смирнов
Алексеев
Евгеньев
Ковалёва
Кузнецов
Медведев
⠀
Создайте структуру базы данных для решения следующей задачи: У управляющей компании стоит задача создать реестр квартир и жильцов дома. При этом нужно понимать, в каком подъезде и на каком этаже находится квартира. Количество квартир на этажах не всегда одинаковое. Количество квартир — 1471, подъездов — 7, этажей в доме — 17. Для квартир необходимо знать площадь и количество прописанных жильцов.
1. Построение логической модели предметной области: ⠀
⠀
2. Построение физической модели предметной области: ⠀
⠀
3. Написание sql-скрипта:
-- Таблица подъездов (entrances)
CREATE TABLE Entrances (
entrance_id SERIAL PRIMARY KEY, -- Идентификатор подъезда
entrance_name VARCHAR(50) NOT NULL -- Номер подъезда
);
-- Таблица этажей (floors)
CREATE TABLE Floors (
floor_id SERIAL PRIMARY KEY, -- Идентификатор этажа
entrance_id INTEGER NOT NULL, -- Внешний ключ на таблицу подъездов
floor_num INTEGER NOT NULL, -- Номер этажа
CONSTRAINT fk_entrance -- Связь
FOREIGN KEY (entrance_id)
REFERENCES Entrances(entrance_id) ON DELETE CASCADE
);
-- Таблица квартир (apartments)
CREATE TABLE Apartments (
apartment_id SERIAL PRIMARY KEY, -- Идентификатор квартиры
entrance_id INTEGER NOT NULL, -- Внешний ключ на таблицу подъездов
floor_id INTEGER NOT NULL, -- Внешний ключ на таблицу этажей
apartment_num VARCHAR(10) NOT NULL, -- Номер квартиры
area DECIMAL(6,2), -- Площадь квартиры
residents INTEGER, -- Количество жильцов
CONSTRAINT fk_floor -- Связь
FOREIGN KEY (floor_id)
REFERENCES Floors(floor_id) ON DELETE CASCADE,
CONSTRAINT fk_entrance_apartment
FOREIGN KEY (entrance_id)
REFERENCES Entrances(entrance_id) ON DELETE CASCADE
);
-- Таблица жильцов (residents)
CREATE TABLE Residents (
resident_id SERIAL PRIMARY KEY, -- Уникальный идентификатор жильца
apartment_id INTEGER NOT NULL, -- Внешний ключ на таблицу квартир
full_name VARCHAR(100) NOT NULL, -- ФИО Жильца
date_of_birth DATE, -- Дата рождения жильца
CONSTRAINT fk_apartment -- Связь
FOREIGN KEY (apartment_id)
REFERENCES Apartments(apartment_id) ON DELETE CASCADE
);Есть массив заказов orders, в котором каждый заказ — это объект {id, status, deliveryDate, items}, где items – массив объектов {productName, cost, quantity}.
Нужно написать функцию, которая:
- Отфильтрует все заказы со статусом "delivered".
- Посчитает общую стоимость всех товаров в каждом заказе.
- Сгруппирует заказы по месяцам доставки.
Итого функция должна вернуть объект, где ключ – это название месяца (в формате "January", "February", и т.д.), а значение – это общая стоимость доставленных заказов за этот месяц.
Пример данных:
const orders = [
{
id: 1,
status: 'delivered',
deliveryDate: '2024-10-05',
items: [
{ productName: 'Item1', quantity: 2, price: 50 },
{ productName: 'Item2', quantity: 1, price: 100 }
]
},
{
id: 2,
status: 'pending',
deliveryDate: '2024-10-12',
items: [
{ productName: 'Item3', quantity: 1, price: 200 }
]
}
];- Создание массива заказов
orders:
const orders = [
{
id: 1,
status: 'delivered',
deliveryDate: '2024-10-05',
items: [
{ productName: 'Item1', quantity: 2, price: 50 },
{ productName: 'Item2', quantity: 1, price: 100 }
]
},
{
id: 2,
status: 'pending',
deliveryDate: '2024-10-12',
items: [
{ productName: 'Item3', quantity: 1, price: 200 }
]
},
{
id: 3,
status: 'delivered',
deliveryDate: '2024-10-15',
items: [
{ productName: 'Item4', quantity: 2, price: 45 },
{ productName: 'Item5', quantity: 1, price: 90 }
]
},
{
id: 4,
status: 'delivered',
deliveryDate: '2024-10-22',
items: [
{ productName: 'Item6', quantity: 2, price: 80 },
{ productName: 'Item7', quantity: 1, price: 200 },
{ productName: 'Item8', quantity: 4, price: 120 }
]
},
{
id: 5,
status: 'pending',
deliveryDate: '2024-11-05',
items: [
{ productName: 'Item9', quantity: 4, price: 120 }
]
},
{
id: 6,
status: 'delivered',
deliveryDate: '2024-11-15',
items: [
{ productName: 'Item10', quantity: 3, price: 30 },
{ productName: 'Item11', quantity: 1, price: 150 }
]
},
{
id: 7,
status: 'delivered',
deliveryDate: '2024-11-20',
items: [
{ productName: 'Item12', quantity: 4, price: 75 },
{ productName: 'Item13', quantity: 2, price: 60 },
{ productName: 'Item14', quantity: 3, price: 90 },
{ productName: 'Item15', quantity: 1, price: 175 }
]
},
{
id: 8,
status: 'delivered',
deliveryDate: '2024-11-25',
items: [
{ productName: 'Item16', quantity: 1, price: 300 }
]
},
{
id: 9,
status: 'delivered',
deliveryDate: '2024-12-01',
items: [
{ productName: 'Item17', quantity: 5, price: 60 },
{ productName: 'Item18', quantity: 2, price: 120 }
]
},
{
id: 10,
status: 'pending',
deliveryDate: '2024-12-10',
items: [
{ productName: 'Item19', quantity: 3, price: 150 }
]
}
];2. Написание функции, выполняющей перечисленные требования:
- Отфильтрует все заказы со статусом "delivered".
- Посчитает общую стоимость всех товаров в каждом заказе.
- Сгруппирует заказы по месяцам доставки.
function sumOrdersByMonth(orders) {
return orders
.filter(order => order.status === 'delivered') // Фильтруем заказы с статусом "delivered"
.reduce((acc, order) => {
// Подсчитываем общую стоимость всех товаров в каждом заказе
const totalCost = order.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
// Получаем месяц доставки
const deliveryMonth = new Date(order.deliveryDate).toLocaleString('en-US', { month: 'long' });
// Группируем по месяцам доставки
if (!acc[deliveryMonth]) {
acc[deliveryMonth] = 0;
}
// Добавляем стоимость заказа в месяц
acc[deliveryMonth] += totalCost;
return acc;
}, {});
}
// Вызов функции
const sumOrders = sumOrdersByMonth(orders);
console.log(sumOrders);Тестирование шага 2. Результат работы функции представлен на рисунке 8.
Ожидаемый результат:
October: 1220
November: 1405
December: 540
⠀







