У вас странное определение «разницы». Для этого используйте подзапрос:
SELECT CONCAT('£ ', n1) AS Total_N1,
CONCAT('£ ', n2) AS Total_N2,
100 * (N1 - N2) / (N1+N2) / 2 as diff
FROM (SELECT SUM(CASE WHEN t1.col_type = 'N1' THEN t2.qty * t1.price ELSE 0 END) as n1,
SUM(CASE WHEN t1.col_type = 'N2' THEN t2.qty * t1.price ELSE 0 END) as n2
FROM t2 INNER JOIN
t1
ON t2.col_id = t1.col_id
) t
Найдите дубликаты и удалите самый старый
Вот Код
create table #Product (
ID int identity(1, 1) primary key,
Name varchar(800),
DateAdded datetime default getdate()
)
insert #Product(Name) select 'Chocolate'
insert #Product(Name,DateAdded) select 'Candy', GETDATE() + 1
insert #Product(Name,DateAdded) select 'Chocolate', GETDATE() + 5
select * from #Product
;with Ranked as (
select ID,
dense_rank()
over (partition by Name order by DateAdded desc) as DupeCount
from #Product P
)
delete R
from Ranked R
where R.DupeCount > 1
select * from #Product
удалите из таблицы a1, где существует (выбор * от таблицы a2 где a2.name = a1.name и a2.date> a1.date)
Вы могли, вероятно, достигнуть, это с самосоединением и ЯВЛЯЕТСЯ NOT NULL.
Присоединение на Запросах на удаление может быть немного опасным, потому что, чем более сложно это, тем больше риск удаления больше, чем Вы намереваются при некоторых обстоятельствах.
Но я приблизился бы к нему как.
DELETE
a.*
FROM
mytable AS a
LEFT JOIN mytable AS b ON
b.date > a.date
AND (b.name=a.name OR (b.date = a.date AND b.rowid>a.rowid))
WHERE
AND b.rowid IS NOT NULL
Соединением и ЯВЛЯЕТСЯ NOT NULL, находит каждую строку, для которой там существует более новая строка с тем же именем. Это также обрабатывает случай двух строк с той же датой правильно - если у них есть та же дата, затем это идет rowid (независимо от того, что это).
Надо надеяться, что-то вроде этого работает.