Задать вопрос
@AlexHeizenberg

Помощь в решении задачи 96, Sql-ex?

Просьба помочь в решении задачи с сайта SQL-ex, SELECT(обучающий этап). Пробовал несколько разных вариантов написания решения, ни один по итогу не проходит проверку на проверочной базе, выходит ошибка: "Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе.

Неверное число записей (меньше на 1).

При этом пробовал в том числе те варианты, которые ранее в сети выкладывались как ответы к этой задаче, и, по видимому, проходили все необходимые проверки. Просьба посмотреть мои решения и подсказать, что именно я мог не учесть. Подозреваю, что сложность задачи возросла после того, как недавно один из создателей сайта добавил дополнительные проверки (об этом в конце марта была новость), но что именно в них я не могу даже предположить. Сами программисты на связь выходить не хотят, поэтому вышел уже на форум.

Схема базы данных состоит из трех отношений:

CREATE TABLE utQ (        -- Таблица utQ содержит идентификатор и название квадрата, цвет которого первоначально черный.
    Q_ID int,             -- идентификатор квадрата
    Q_NAME varchar(35));  -- название квадрата
CREATE TABLE utV (        -- Таблица utV содержит идентификатор, название и цвет баллончика с краской.
    V_ID int,             -- идентификатор баллончика с краской
    V_NAME varchar(35),   -- название баллончика с краской
    V_COLOR char(1));     -- цвет баллончика с краской
CREATE TABLE utB (        -- Таблица utB содержит информацию об окраске квадрата баллончиком: время окраски, идентификатор квадрата, идентификатор баллончика, количество краски.
    B_DATETIME datetime,  -- время окраски
    B_Q_ID int,           -- идентификатор квадрата
    B_V_ID int,           -- идентификатор баллончика
    B_VOL tinyint);       -- количество краски

При этом следует иметь в виду, что:
  • - баллончики с краской могут быть трех цветов - красный V_COLOR='R', зеленый V_COLOR='G', голубой V_COLOR='B' (латинские буквы).
  • - объем баллончика равен 255 и первоначально он полный;
  • - цвет квадрата определяется по правилу RGB, т.е. R=0,G=0,B=0 - черный, R=255, G=255, B=255 - белый;
  • - запись в таблице закрасок utB уменьшает количество краски в баллончике на величину B_VOL и соответственно увеличивает количество краски в квадрате на эту же величину;
  • - значение 0 < B_VOL <= 255;
  • - количество краски одного цвета в квадрате не превышает 255, а количество краски в баллончике не может быть меньше нуля;
  • - время окраски B_DATETIME дано с точностью до секунды, т.е. не содержит миллисекунд.


Текст задачи:

При условии, что баллончики с красной краской использовались более одного раза, выбрать из них такие, которыми окрашены квадраты, имеющие голубую компоненту.
Вывести название баллончика


Мои варианты ответа к задаче:

Вариант 1:

with r as (
    select v.v_name, 
           v.v_id, 
           count(case when v_color = 'R' then 1 end) over(partition by v_id) cnt_r, 
           count(case when v_color = 'B' then 1 end) over(partition by b_q_id) cnt_b 
    from utV v join utB b on v.v_id = b.b_v_id
    ) 
select v_name 
from r 
where cnt_r > 1 
  and cnt_b > 0 
group by v_name


Вариант 2:

WITH RED_V AS ( 
SELECT V_name, B_V_ID 
FROM utV v 
JOIN utB b ON v.V_ID = b.B_V_ID 
WHERE V_COLOR = 'R' 
GROUP BY V_name, B_V_ID 
HAVING COUNT(v.V_ID) > 1 
), 
BLUE_V AS ( 
SELECT V_name, B_V_ID 
FROM utV v 
JOIN utB b ON v.V_ID = b.B_V_ID 
WHERE B_Q_ID IN ( 
SELECT B_Q_ID 
FROM utB b 
JOIN utV v ON v.V_ID = b.B_V_ID 
WHERE V_COLOR = 'B') 
) 
SELECT DISTINCT R.V_name 
FROM RED_V R 
JOIN BLUE_V B ON R.B_V_ID = B.B_V_ID


Вариант 3:

select distinct v_name 
from (Select *, Sum(iif( V_color='r', 1, 0)) over (partition by V_name) red, Sum(iif( V_color='b', 1, 0)) over (partition by B_Q_ID) blue 
From utV JOIN utB ON V_id=B_V_id) t 
where red>1 and blue>0
  • Вопрос задан
  • 210 просмотров
Подписаться 1 Средний 21 комментарий
Решения вопроса 1
@AlexHeizenberg Автор вопроса
Добил задачу каким-то чудом через EXISTS и немного нейросетки, хотя принципиальной разницы с вариантами ранее не увидел):

SELECT v_red.V_name
FROM utV v_red
JOIN utB b_red ON v_red.V_ID = b_red.B_V_ID
WHERE v_red.V_COLOR = 'R'
GROUP BY v_red.V_name, b_red.B_V_ID
HAVING COUNT(b_red.B_DATETIME) > 1
   AND EXISTS (
       SELECT 1
       FROM utB b_blue
       JOIN utV v_blue ON v_blue.V_ID = b_blue.B_V_ID
       WHERE v_blue.V_COLOR = 'B'
         AND b_blue.B_Q_ID IN (
             SELECT b_red_inner.B_Q_ID
             FROM utB b_red_inner
             WHERE b_red_inner.B_V_ID = b_red.B_V_ID
         )
   )


Akina спасибо за подсказку
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Полагая, что все-таки имеется в виду "любой красный баллончик, который красил хоть один квадрат с синим и при этом красил где угодно еще, даже еще раз на этом же квадрате" - вот такое, топорное:
SELECT DISTINCT v1.V_NAME FROM utV AS v1
LEFT JOIN utB AS b1 ON v1.V_ID = b1.B_V_ID AND v1.V_COLOR = 'R'
LEFT JOIN utB AS b2 ON b1.B_Q_ID = b2.B_Q_ID AND b1.B_V_ID != b2.B_V_ID
LEFT JOIN utV AS v2 ON v2.V_ID = b2.B_V_ID AND v2.V_COLOR = 'B'
WHERE v2.V_ID IS NOT NULL
AND v1.V_ID IN 
(SELECT B_V_ID FROM utB GROUP BY B_V_ID HAVING COUNT(1) > 1);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
OSZAR »