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

Откуда: СФО
Сообщений: 1269
Здравствуйте, помогите пожалуйста решить задачку. В акцесс вроде как есть группировка по First, Last, а в SQL кажется такого нету?
Имеется в наличии таблица dbf. Таблица присоединена через linked server и имею к ней полный доступ. (использую MS SQL 2008 R2)
К сожалению организована она из рук вон плохо, ключевого поля как такового не имеет, ну или оно весьма условно.
упрощенно задача, выбрать из таблицы только первые встречающиеся записи по сочетанию полей ID1 ID2.

имеем таблицу
ID1 ID2 X Y Z
1 1 а б в
2 1 а г д
5 2 и к л
2 1 д м л


после выборки должно получится:

ID1 ID2 X Y Z
1 1 а б в
2 1 а г д
5 2 и к л
18 янв 13, 12:24    [13790317]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
qwerty112
Guest
select top 1 with ties * from t
order by row_number() over(partition by ID1, ID2 order by ID1, ID2) 


зы
и про "В акцесс вроде как есть группировка по First, Last" - забудьте,
это фикция
18 янв 13, 12:35    [13790402]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Изерлонер,

что такое "только первые встречающиеся записи по сочетанию полей ID1 ID2"?
В SQL такого не бывает, если только записи не уникальные "по сочетанию полей ID1 ID2".
18 янв 13, 13:04    [13790637]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Хорошо. А такой запрос пройдет в случае со связанным сервером? Запросы к этой таблице осуществляются через OpenQuery. Сервер связан через драйвер JET.4.0
18 янв 13, 13:06    [13790658]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
iap
В SQL такого не бывает, если только записи не уникальные "по сочетанию полей ID1 ID2".

В SQL может и не бывает. А в фокспро ранних версий видимо есть. Таблица (таблицы, их много) не мои и доставили мне массу головной боли. Ключ там вроде и есть но какой то особенный. Может повторяться. Данные по ключу считаются нарастающим итогом как я понял.
18 янв 13, 13:11    [13790711]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Лучше уж сказать признак, а не ключ. :(
18 янв 13, 13:13    [13790729]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Изерлонер
Лучше уж сказать признак, а не ключ. :(
Вы же не говорите, первая запись в порядке возрастания/убывания какого поля/полей Вас интересует.
А могли бы сказать.
18 янв 13, 14:16    [13791437]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
iap
Изерлонер
Лучше уж сказать признак, а не ключ. :(
Вы же не говорите, первая запись в порядке возрастания/убывания какого поля/полей Вас интересует.
А могли бы сказать.

Да я сам не знаю. :(
Связывался с разработчиком, он говорит что для данных о приходе надо взять первые записи (видимо те которые раньше появилась в базе), следующие же записи - данные о перемещениях, даже привел сам запрос на фоксе, но я в нем мало что понять могу (могу впрочем здесь привести, может кто-нибудь разберется) :(
Что касается первой записи... в таблице есть поле с данными о дате. Наверное можно было бы сделать запрос по ключевым полям (назову их все же так) с условием Min(Date). ... только мне почему то кажется это не сильно поможет, ведь перемещения по складам могут быть и в тот же день (в день прихода). Остается лишь вариант что эта таблица нечто в виде стека, и положение записей друг относительно друга не меняется.
18 янв 13, 16:01    [13792403]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Изерлонер,

таблица - неупорядоченная куча записей.
Лучше посмотрите, может в поле Date и время тоже есть?
Тогда поставьте его в ORDER BY запроса qwerty112:
select top 1 with ties * from t
order by row_number() over(partition by ID1, ID2 order by [Date] DESC);
18 янв 13, 16:06    [13792457]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Вот схема базы (воссоздал ее в акцесс). Повторяющиеся записи в таблицах wrk6, wrk8 (приход, расход):

К сообщению приложен файл. Размер - 85Kb
18 янв 13, 16:08    [13792489]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
iap
Изерлонер,

Лучше посмотрите, может в поле Date и время тоже есть?

Нету там времени. По крайней мере в MS SQL дата импоритруется в формате datetime с нулями по времени.
18 янв 13, 16:10    [13792515]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
А вот комментарии и запрос от автора:

например "приход в excel" - выделил комментарий

= xsx(2)
select wrk6
set filter to
set relation to
set order to
select wrk5
set filter to
set relation to
set order to
exitform = !askd() && запросить период!
\ЗАТРАТЫ по изделию за период с {otdate1} по {otdate2}
SELECT * from wrk5 where datenum>=otdate1 and datenum<=otdate2 and stat!=6 into dbf x5 && выбрать все приходы за период, кроме ПЕРЕМЕЩЕНИЯ(stat!=6), то есть только реальные приходы, откуда и можно взять поставщика!
SELECT space(50) as name,datenum,kf,space(20) as zeh,b.* from x5 a,wrk6 b where a.numsk=b.numsk and a.num=b.num into dbf x6 && выбрать все товары по приходам, обратите внимание на связку по двум полям a.numsk=b.numsk and a.num=b.num
SELECT space(30) as post,space(12) as numsf,{//} as datepost,kodd,kodd2,a.*, 000000000.00 as summa from x6 a,wrk3 c,wrk2 d where a.kod=c.kod and c.kg=d.kg into dbf x
set relation to kod into wrk3, kf into wrk12
replace all zeh with wrk12.name, name with nt5(50), summa with cnt*pricei
SCAN
scatter memvar && считать поля в переменные
select 6
locate for kod=m.kod and part=m.part && ИСКАТЬ по коду и партии берём склад и номер документа
m.numsk2 = numsk
m.num2 = num
select 5
LOCATE for numsk=m.numsk2 and num=m.num2 && ищем документ и берём все нужные данные
m.datepost = dateb && дата входящего документа
m.numsf = numstr && номер входящей с-ф
m.kf2 = kf && код поставщика
select wrk12
LOCATE for kf=m.kf2
m.post = name && наименование поставщика
select x
replace post with m.post, datepost with m.datepost, numsf with m.numsf
endSCAN

select datenum,numsk,num,name,cnt,pricei,summa,numsf,datepost,post,kodd from x into dbf otchet order by datenum
use in otchet
! start.exe excel.exe otchet.dbf
exitform = .t
18 янв 13, 16:11    [13792536]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
И еще дополнение от автора:

автор
Перед всеми запросами в начале - создайте базу свойств ПАРТИЙ товара!
Мелкие запросы (одиночные или парные по связке) проще для понимания и быстрее работают! На фоксе:

select * from wrk5 where stat!=6 into dbf x
select kod,part,cnt,pricei, x.* from x, wrk6 where x.numsk=wrk6.numsk and x.num=wrk6.num into dbf x2
select x2.*,name from x2, wrk12 where x2.kf=wrk12.kf into dbf PARTDBF

а потом её можно использовать везде где надо, можете создать один ключ kod*1000+part

Тут может быть ошибка оператора - если он снимет статус перемещения в приходе - то на партию может быть больше 1 записи!
Именно по этому в отчёте я пользуюсь не запросом, а поиском - он находит ПЕРВУЮ запись о приходе - она конечно раньше в базе появляется, чем перемещения! Запрос с группировкой group by kod,part - даст ПОСЛЕДНЮЮ запись

Вторая ошибка может быть такая - сделали приход - пустили гулять по всем складам - а сами переделали приход - удали - сделали по новой - получится потерянная "ПАРТИЯ" - без реального прихода, появляется первый раз в складе на который переместили.
18 янв 13, 16:14    [13792569]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Изерлонер
Тут может быть ошибка оператора - если он снимет статус перемещения в приходе - то на партию может быть больше 1 записи!


Вот эта вот ошибка оператора капитально мне сегодня нервы вымотала. :( Теперь и думаю как переделать свой запрос что бы такие ошибки мимо меня проходили.
18 янв 13, 16:17    [13792607]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Мой запрос был элементарным:
Select *
From wrk5 Join wrk6 ON wrk5.numsk = wrk6.numsk
Join wrk3 ON wrk3.kod =wrk6.kod
--... еще пара объединений...
Where stat <> 6

Но по этому запросу пропадают данные о приходе, которые ДОЛЖНЫ быть в таблице. Значит надо делать по аналогии с авторским запросом. Искать первую запись. :(
18 янв 13, 16:23    [13792659]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Изерлонер
И еще дополнение от автора:

автор
Тут может быть ошибка оператора - если он снимет статус перемещения в приходе - то на партию может быть больше 1 записи!

Называть последствия ошибки проектирования БД (или ПО, или и того и другого) — "ошибкой оператора"... это круто, конечно.
Изерлонер, мои соболезнования, что приходится с ЭТИМ работать.
18 янв 13, 16:24    [13792678]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Изерлонер,

забыл...
Select *
From wrk5 Join wrk6 ON wrk5.numsk = wrk6.numsk AND wrk5.num = wrk6.num
Join wrk3 ON wrk3.kod =wrk6.kod
--... еще пара объединений...
Where stat <> 6
18 янв 13, 16:25    [13792685]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Гость333
Называть последствия ошибки проектирования БД (или ПО, или и того и другого) — "ошибкой оператора"... это круто, конечно.
Изерлонер, мои соболезнования, что приходится с ЭТИМ работать.

Ну тут надо скидку делать на то что база делалась еще в 94 году. И ошибка или нет это все работает до сих пор и работает не плохо. Проблемы начинаются когда я это все к себе встроить пытаюсь.
18 янв 13, 16:27    [13792707]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Перепроверил все. Действительно с одним сочетанием "ключа" KOD-PART может быть несколько значений в день. Значит min(date) отпадает. Исходные таблицы таки упорядочены по дате, самые ранние даты вверху. Так что остается только один способ - выдача первых встречающихся значений по сочетанию kod-part. Как и думал изначально.
18 янв 13, 17:03    [13792989]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
qwerty112
select top 1 with ties * from t
order by row_number() over(partition by ID1, ID2 order by ID1, ID2) 




Ваш запрос видимо все таки переупорядочивает таблицу, а не оставляет ее как есть. Из-за этого выдает не верные результаты для моего случая.
18 янв 13, 17:18    [13793060]     Ответить | Цитировать Сообщить модератору
 Re: Выбор первой записи удовлетворяющей критериям  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Изерлонер
для моего случая

select top 1 with ties * From OpenQuery (Матгруппа, 'Select * From wrk5 inner join wrk6 on wrk5.numsk = wrk6.numsk AND wrk5.num = wrk6.num') 
order by row_number() over(partition by KOD, PART order by KOD, PART)
18 янв 13, 17:19    [13793068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить