Помогите с запросом

Kronix

Есть список nameid типа char, причем в списки элементы повторяются, необходимо написать запрос, чтобы остались только последние nameid
23 ответа

Kronix

Есть список nameid типа char, причем в списки элементы повторяются, необходимо написать запрос, чтобы остались только последние nameid
Если список только из одного столбца, "последний" по каким критериям ?


Kronix

список не из одного столбца


Kronix

список не из одного столбца
"Есть список nameid типа char"


Kronix

А как понять это это nameid последнее?


Kronix

мда, неправильно выразился, не список, таблица, одна из колонок nameid, необходимо удалить все записи, кроме последних, у которых nameid одинаковые


Kronix

мда, неправильно выразился, не список, таблица, одна из колонок nameid, необходимо удалить все записи, кроме последних, у которых nameid одинаковые
Что есть "последняя" запись для одинаковых nameid ?


Kronix

пример:'a1',123 'a2',1414'a2',1231'a1',114'a2',214после обработки:'a1',114'a2',214


Kronix

пример:'a1',123'a2',1414'a2',1231'a1',114'a2',214после обработки:'a1',114'a2',214
а если так?'a1',123'a2',1414'a2',1231'a1',114'a2',214'a2',528


Kronix

'a1',114'a2',528


Kronix

Для начала добавьте в таблицу поле RowID int identity или Inserted datetime default getdate()


Kronix

2 Kronixоднажды, Вам уже пытались объяснить, что "просто" первых и последних записей не бывает. тогда Вам кто-то показал set rowcount и на этом Вы успокоились. напрасно... "последнюю" запись можно найти, только если есть какой-то критерий, по которому она является последней. например, если в таблице есть поле типа datetime, то можно найти "последнюю" запись по этому полю. то есть, запись с максимальным значением этого поля.


Kronix

Пойдет?declare @t table (colID varchar(2), colValue int)insert @t values ('a1', 123)insert @t values ('a2', 1414)insert @t values ('a2', 1231)insert @t values ('a1', 114)insert @t values ('a2', 214)select *from @t twhere exists(select 1 from @t where colID = t.colID group by colID having min(colValue) = t.colValue)


Kronix

Если у Вас на таблице нет ни одного ключа, никаких кластеред индексов,но Вы хотите сохранить только порядок "как есть", т.е. физический,в EM добавьте колонку ID int IDENTITYОна отрисует возрастание ID, ориентируясь на неявный ключ.А далее - группировка по max(ID)


Kronix

2 Prolog: нужно без вских добавлений2 daw: плохо пытались, а я плохо соображаю, кроме того последню запись можно найти, использовав order by..desk с top(limit)2 RENaissance: вы немного не поняли закономерность, сортировка не по colvalue, см. 2 примерВообще, конечно, вариант есть, взять все сгрузить в массив1(order by ..desc) и сделать выборку типа:цикл от 1 до последней записи в массиве1 Если элемент записи есть в массиве2, то удаляем его из массива1 иначе, записываем элемент записи в массив2 и удаляем его из массива1следующий элементНо для 250000 записей это немного долговато будет, хотя если ничего никто не подскажет, то наверное придется сделать именно так


Kronix

все сгрузить в массив1(order by ..desc) Судя по всему критерий "последний" так и останется неизвестным.Но для 250000 записей это немного долговато будет, хотя если ничего никто не подскажет, то наверное придется сделать именно такМожно лишь посоветовать проектировать таблицы в соотвествии с теорией реляционных баз данных


Kronix

to Gloryскорее всего на таблице ничего нет, а под "порядком следования" понимается порядок, который возвращается при open table


Kronix

2 Prolog: нужно без вских добавлений
Пока не добавите - ничего не получится, кроме проблем. Ваше решение с массивом будет выдавать и может быть довольно-таки часто нужное вам решение. Но не всегда!!!


Kronix

взять все сгрузить в массив1(order by ..desc)
Раз есть по чему ордер, то при всём богатстве выбора только один вариант1. если [колонку_по_которой_деск] можно подвергнуть MIN(колонка_по_которой_деск),т.е. тип дата, инт и т.д.можно было бы сгруппировать, если бы была гарантия уникальностиА в общем случае как ни крутите нужна доп.колонка ID2. если [колонка_по_которой_деск] типа стринг, то, опять же, нужна доп.колонка IDВ общем не отпирайтесь :-) ставьте колонку ...


Kronix

хорошо, сделал ID int IDENTITY, что делать дальше?


Kronix

Типа этого:
select nameid, Value from Table where id in (
(select max(id) from Table
group by nameid))


Kronix

declare @t table(id int identity, named varchar(<b>20</b>), c int)

insert @t values('a1',<b>123</b>)
insert @t values('a2',<b>1414</b>)
insert @t values('a2',<b>1231</b>)
insert @t values('a1',<b>114</b>)
insert @t values('a2',<b>214</b>)

--или так
select t1.named,
	t1.c
	from @t t1 join
	(select max(id) as id
		from @t
		group by named) t2 on t1.id = t2.id
--или так
select named,
	(select top <b>1</b> c from @t where named = t.named order by id desc) as c
	from @t t
	group by named


Kronix

спасибо


Kronix

select nameid,max(rownum) from tablegroup by nameid;