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

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

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


Схема базы:

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

    При этом следует иметь в виду, что:

  • - баллончики с краской могут быть трех цветов - красный 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


Заранее спасибо!
  • Вопрос задан
  • 169 просмотров
Подписаться 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);
Ответ написан
Ваш ответ на вопрос

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

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