Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение записей в таблице  [new]
Crank_1986
Member

Откуда:
Сообщений: 4
Изучаю sql столкнулся со сложностями в решении элементарной задачи.
Имеется два отношения: в отношение Battles включены название и дата битвы, в которой участвовали корабли, а в отношении Outcomes – название корабля, название битвы, в которой они участвовали, результат участия данного корабля в битве (потоплен-sunk, поврежден - damaged или невредим - OK).

Условие задачи: найдите корабли, `сохранившиеся для будущих сражений`; т.е. выведенные из строя в одной битве (damaged), они участвовали в другой, произошедшей позже.

В целом у меня есть понимение, как решить задачу, но проблема в том, чтобы выполнить основное условие задачи: "найдите корабли, `сохранившиеся для будущих сражений`. Каким образом можно сравнить дату битвы одного и того же корабля? То есть есть две записи, одна более ранняя, другая более поздняя, если у корабля есть запись с более поздней датой битвы , значит он удовлетворят условиям задачи.

пробовал решить так, но тут неправильно сравниваются даты, а как правильно я не знаю.

with One as (select ship, date, battle
            from outcomes o join battles b
            on o.battle = b.name
            where ship in (select ship
                                from outcomes o join battles b
                                on o.battle = b.name
                                where result = 'damaged'))
select o.ship, o.date
from One o join (select date, ship
                    from outcomes o join battles b
                    on o.battle = b.name
                    where result = 'damaged') as b
on o.ship = b.ship
where o.date > b.date
Having count(o.battle) > 1
12 дек 19, 11:11    [22038478]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение записей в таблице  [new]
court
Member

Откуда:
Сообщений: 1986
Crank_1986,

1
самое простое, очевидное и "читаемое" это отбор с условием where result = 'damaged'
+ exists в котором проверяешь, что для этого корабля, есть запись с бОльшей датой чем в основном запросе

2
или проявить "смекалку" :)
select ship
from ...
group by ship
having min(case when result = 'damaged' then [date] end) < max([date])
12 дек 19, 11:23    [22038491]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение записей в таблице  [new]
Crank_1986
Member

Откуда:
Сообщений: 4
court, Спасибо за ответ, будем пробовать)

Сообщение было отредактировано: 12 дек 19, 11:26
12 дек 19, 11:26    [22038492]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение записей в таблице  [new]
Crank_1986
Member

Откуда:
Сообщений: 4
Получилось, ключевым оказалось то, что нужно для искать дату для ЭТОГО же корабля, чего я не делал, хотя, блин это очевидно)
Еще раз спрасибо!
12 дек 19, 11:34    [22038504]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить