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

Откуда: Бобруйск
Сообщений: 334
Коллеги, выручайте, нужна помощь с запросом
имею следующую выборку

with cte (name, date, status) as (
select 'Товар 1', '28.03.2014', '1' union all
select 'Товар 1', '29.03.2014', '1' union all
select 'Товар 1', '31.03.2014', '1' union all
select 'Товар 1', '03.04.2014', '1' union all
select 'Товар 1', '12.04.2014', '1' union all
select 'Товар 1', '13.04.2014', '10' union all
select 'Товар 1', '17.04.2014', '10' union all
select 'Товар 1', '21.04.2014', '11' union all
select 'Товар 1', '22.04.2014', '1' union all
select 'Товар 1', '26.04.2014', '1' union all
select 'Товар 1', '27.04.2014', '10' union all
select 'Товар 1', '30.04.2014', '10' union all
select 'Товар 1', '01.05.2014', '10' union all
select 'Товар 1', '10.05.2014', '11' union all
select 'Товар 1', '11.05.2014', '11' union all
select 'Товар 1', '07.06.2014', '12' union all
select 'Товар 1', '12.06.2014', '12' union all
select 'Товар 1', '21.06.2014', '12' union all
select 'Товар 1', '22.06.2014', '12' union all
select 'Товар 1', '23.10.2014', '1' union all
select 'Товар 1', '31.10.2014', '0'

)

имею выборку для определенного товара историю статусов в разные даты
нужно получить выборку вида

Товар 1 28.03.2014 1 28.03.2014
Товар 1 29.03.2014 1 28.03.2014
Товар 1 31.03.2014 1 28.03.2014
Товар 1 03.04.2014 1 28.03.2014
Товар 1 12.04.2014 1 28.03.2014
Товар 1 13.04.2014 10 13.04.2014
Товар 1 17.04.2014 10 13.04.2014
Товар 1 21.04.2014 11 21.04.2014
Товар 1 22.04.2014 1 22.04.2014
Товар 1 26.04.2014 1 22.04.2014
Товар 1 27.04.2014 10 27.04.2014
Товар 1 30.04.2014 10 27.04.2014
Товар 1 01.05.2014 10 27.04.2014
Товар 1 10.05.2014 11 10.05.2014
Товар 1 11.05.2014 11 10.05.2014
Товар 1 07.06.2014 12 07.06.2014
Товар 1 12.06.2014 12 07.06.2014
Товар 1 21.06.2014 12 07.06.2014
Товар 1 22.06.2014 12 07.06.2014
Товар 1 23.10.2014 1 23.10.2014
Товар 1 31.10.2014 0 31.10.2014

где в окне статуса будет отображаться минимальная дата, когда товар в этот статус перешел.

Помогите, люди добрые.
спс
8 дек 14, 00:32    [16964210]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
пока мне удалось только ранжировать группы
NTILE(50) OVER (PARTITION BY name,statusORDER BY date) AS range_group


но это не то, этот синтаксист ранжирует всквозь, а мне бы каждое окно ранжировать отдельной группой. потому как в какой-то момент товар может вернуться к первоначальному статусу, и тогда дата должна быть именно из это окна, а не из окна уже давно прошедшего.
8 дек 14, 00:56    [16964276]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
Товар 1	28.03.2014	1	28.03.2014
Товар 1 29.03.2014 1 28.03.2014
Товар 1 31.03.2014 1 28.03.2014
Товар 1 03.04.2014 1 28.03.2014
Товар 1 12.04.2014 1 28.03.2014
Товар 1 13.04.2014 10 13.04.2014
Товар 1 17.04.2014 10 13.04.2014
Товар 1 21.04.2014 11 21.04.2014
Товар 1 22.04.2014 1 22.04.2014
Товар 1 26.04.2014 1 22.04.2014
Товар 1 27.04.2014 10 27.04.2014
Товар 1 30.04.2014 10 27.04.2014
Товар 1 01.05.2014 10 27.04.2014
Товар 1 10.05.2014 11 10.05.2014
Товар 1 11.05.2014 11 10.05.2014
Товар 1 07.06.2014 12 07.06.2014
Товар 1 12.06.2014 12 07.06.2014
Товар 1 21.06.2014 12 07.06.2014
Товар 1 22.06.2014 12 07.06.2014
Товар 1 23.10.2014 1 23.10.2014
Товар 1 31.10.2014 0 31.10.2014

ожидаемый результат. извините за пост выше, я подумал, что так читать будет удобней
8 дек 14, 01:10    [16964287]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
with cte (name, date, status) as ( 
select 'Товар 1', convert(datetime,'28.03.2014',104), '1' union all
select 'Товар 1', convert(datetime,'29.03.2014',104), '1' union all
select 'Товар 1', convert(datetime,'31.03.2014',104), '1' union all
select 'Товар 1', convert(datetime,'03.04.2014',104), '1' union all
select 'Товар 1', convert(datetime,'12.04.2014',104), '1' union all
select 'Товар 1', convert(datetime,'13.04.2014',104), '10' union all
select 'Товар 1', convert(datetime,'17.04.2014',104), '10' union all
select 'Товар 1', convert(datetime,'21.04.2014',104), '11' union all
select 'Товар 1', convert(datetime,'22.04.2014',104), '1' union all
select 'Товар 1', convert(datetime,'26.04.2014',104), '1' union all
select 'Товар 1', convert(datetime,'27.04.2014',104), '10' union all
select 'Товар 1', convert(datetime,'30.04.2014',104), '10' union all
select 'Товар 1', convert(datetime,'01.05.2014',104), '10' union all
select 'Товар 1', convert(datetime,'10.05.2014',104), '11' union all
select 'Товар 1', convert(datetime,'11.05.2014',104), '11' union all
select 'Товар 1', convert(datetime,'07.06.2014',104), '12' union all
select 'Товар 1', convert(datetime,'12.06.2014',104), '12' union all
select 'Товар 1', convert(datetime,'21.06.2014',104), '12' union all
select 'Товар 1', convert(datetime,'22.06.2014',104), '12' union all
select 'Товар 1', convert(datetime,'23.10.2014',104), '1' union all
select 'Товар 1', convert(datetime,'31.10.2014',104), '0'

),prevdata as(
select name,date, status
,ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY Date) AS N
,ROW_NUMBER()OVER(PARTITION BY NAME,STATUS ORDER BY Date) AS N1
from cte)
select name,date,status
,MIN(date) OVER(PARTITION BY N-N1) as MinDateByStatus
from prevdata
order by Date
8 дек 14, 07:05    [16964408]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Daosist
Member

Откуда:
Сообщений: 16
Здравствуйте.Ребят выручайте,выдает ошибки синтаксиса между ' ',не могу понять в чем дело :
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ADOQuery1.Open;
ADOQuery1.SQL.Clear;
ADOQuery1.Parameters.AddParameter.Name:='p1';
ADOQuery1.SQL.Text:=('SAU_values.DateAndTime,SAU_values.TagIndex,SAU_values.Val,SAU_Names.TagName,SAU_names.TagIndex From SAU_Names Inner Join SAU_values ON SAU_names.TadIndex=SAU_values.TagIndex WHERE (DateAndTime >=:d1) and (DateAndTime <=:d2) And SAU_names.TagName =:p1');
ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true);
ADOQuery1.Parameters.ParamByName('d1').Value:=DateTimePicker1.DateTime;
ADOQuery1.Parameters.ParamByName('d2').Value:=DateTimePicker2.DateTime;
ADOQuery1.Parameters.ParamByName('p1').Value:=DBLookupListBox1.KeyValue;
ADOQuery1.Active:=True;
if ADOQuery1.FieldByName('DateAndTime').AsString = '' then
if ADOQuery1.FieldByName('TagIndex').AsString = '' then
Memo1.Lines.Text:=ADOQuery1.SQL.Text;
end;
8 дек 14, 07:45    [16964428]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
ADOQuery1.SQL.Text:=('SELECT SAU_values. ....
8 дек 14, 08:04    [16964432]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Daosist
Member

Откуда:
Сообщений: 16
LexusR,Спасибо,как пропустил не пойму...Но теперь ругается на несогласованность данных.
Вообще задача такая есть 2 таблицы из которых выборочно нужны каналы по индексу,т.е.индексы в обоих таблицах одинаковы.
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ADOQuery1.Open;
ADOQuery1.SQL.Clear;
ADOQuery1.Parameters.AddParameter.Name:='p1';
ADOQuery1.SQL.add('Select SAU_values.DateAndTime,SAU_values.TagIndex,SAU_values.Val,SAU_Names.TagName,SAU_names.TagIndex From SAU_Names Inner Join SAU_values ON SAU_names.TadIndex=SAU_values.TagIndex');
ADOQuery1.SQL.add('WHERE (DateAndTime >=:d1) and (DateAndTime <=:d2) And SAU_names.TagName =:p1');
ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true);
ADOQuery1.Parameters.ParamByName('d1').Value:=DateTimePicker1.DateTime;
ADOQuery1.Parameters.ParamByName('d2').Value:=DateTimePicker2.DateTime;
ADOQuery1.Parameters.ParamByName('p1').Value:=DBLookupListBox1.KeyValue;
ADOQuery1.Active:=True;
if ADOQuery1.FieldByName('DateAndTime').AsString = '' then
if ADOQuery1.FieldByName('TagIndex').AsString = '' then
Memo1.Lines.Text:=ADOQuery1.SQL.Text;

end;
8 дек 14, 08:36    [16964462]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
запрос по виду похож на правильный .
Почему ругается Delphi спросите на форуме Delphi
8 дек 14, 08:45    [16964471]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
Daosist
Но теперь ругается на несогласованность данных.
Зачем пересказывать ошибки своими словами? Скопируйте полный текст, с номером и т.д., и выкладывайте сюда.

Если ошибка сиквельная, поможем, если дельфёвая, лучше сразу в форум по дельфи.
8 дек 14, 09:36    [16964584]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
LexusR , спасибо человечище, то что нужно!!!
8 дек 14, 11:27    [16965127]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Wlr-l
Member

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

begin
ADOQuery1.Open;
ADOQuery1.SQL.Clear;

ADOQuery1.Parameters.AddParameter.Name:='p1'; параметры не задаются до формирования запроса

ADOQuery1.SQL.add('Select SAU_values.DateAndTime,SAU_values.TagIndex,SAU_values.Val,SAU_Names.TagName,SAU_names.TagIndex From SAU_Names Inner Join SAU_values ON SAU_names.TadIndex=SAU_values.TagIndex');
ADOQuery1.SQL.add('WHERE (DateAndTime >=:d1) and (DateAndTime <=:d2) And (SAU_names.TagName =:p1'); пропущена скобка, возможно перед WHERE нужно поставить пробел.

ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true);
ADOQuery1.Parameters.ParamByName('d1').Value:=DateTimePicker1.DateTime;
ADOQuery1.Parameters.ParamByName('d2').Value:=DateTimePicker2.DateTime;
ADOQuery1.Parameters.ParamByName('p1').Value:=DBLookupListBox1.KeyValue;

Memo1.Lines.Text:=ADOQuery1.SQL.Text; Посмотрите на сформированный запрос.

//ADOQuery1.Active:=True;
//if ADOQuery1.FieldByName('DateAndTime').AsString = '' then
//if ADOQuery1.FieldByName('TagIndex').AsString = '' then
//Memo1.Lines.Text:=ADOQuery1.SQL.Text;
8 дек 14, 11:33    [16965182]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Daosist
Member

Откуда:
Сообщений: 16
Wlr-l,

Спасибо,оч помогло=))
8 дек 14, 11:56    [16965337]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Wlr-l
Member

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

Да, еще ParseSQL нужно заменить на Prepare.
8 дек 14, 12:12    [16965435]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
коллеги. еще вопрос
имею две выборки
with cte1 (dat1) as (
select convert(date, '2014-04-03', 120) union all
select convert(date, '2014-04-12', 120) union all
select convert(date, '2014-04-13', 120) union all
select convert(date, '2014-04-17', 120) union all
select convert(date, '2014-04-21', 120) union all
select convert(date, '2014-04-22', 120) union all
select convert(date, '2014-04-26', 120) union all
select convert(date, '2014-04-27', 120) union all
select convert(date, '2014-04-30', 120) union all
select convert(date, '2014-05-01', 120) union all
select convert(date, '2014-05-10', 120) union all
select convert(date, '2014-05-11', 120) union all
select convert(date, '2014-05-15', 120) union all
select convert(date, '2014-05-24', 120) union all
select convert(date, '2014-05-25', 120) union all
select convert(date, '2014-05-29', 120) union all
select convert(date, '2014-05-31', 120) union all
select convert(date, '2014-06-07', 120) union all
select convert(date, '2014-06-12', 120) union all
select convert(date, '2014-06-21', 120) union all
select convert(date, '2014-06-22', 120) union all
select convert(date, '2014-06-26', 120) union all
select convert(date, '2014-06-30', 120) union all
select convert(date, '2014-07-31', 120) union all
select convert(date, '2014-08-17', 120) union all
select convert(date, '2014-08-31', 120) union all
select convert(date, '2014-09-30', 120) union all
select convert(date, '2014-10-22', 120) union all
select convert(date, '2014-10-23', 120) union all
select convert(date, '2014-10-31', 120)
)
select * from cte1 

;with cte2 (dat2) as (
select convert(date, '2014-01-06', 120) union all
select convert(date, '2014-01-18', 120) union all
select convert(date, '2014-02-01', 120) union all
select convert(date, '2014-02-15', 120) union all
select convert(date, '2014-03-01', 120) union all
select convert(date, '2014-03-15', 120) union all
select convert(date, '2014-03-29', 120) union all
select convert(date, '2014-04-12', 120) union all
select convert(date, '2014-04-26', 120) union all
select convert(date, '2014-05-10', 120) union all
select convert(date, '2014-05-24', 120) union all
select convert(date, '2014-06-07', 120) union all
select convert(date, '2014-06-21', 120) 
)


select * from cte2



как из этих двух выборок сделать следующую выборку:

dat1 dat2
03.04.2014 01.02.1900
12.04.2014 01.02.1900
13.04.2014 12.04.2014
17.04.2014 12.04.2014
21.04.2014 12.04.2014
22.04.2014 12.04.2014
26.04.2014 12.04.2014
27.04.2014 26.04.2014
30.04.2014 26.04.2014
01.05.2014 26.04.2014
10.05.2014 26.04.2014
11.05.2014 10.05.2014
15.05.2014 10.05.2014
24.05.2014 10.05.2014
25.05.2014 24.05.2014
29.05.2014 24.05.2014
31.05.2014 24.05.2014
07.06.2014 24.05.2014
12.06.2014 07.06.2014
21.06.2014 07.06.2014
22.06.2014 21.06.2014
26.06.2014 21.06.2014
30.06.2014 21.06.2014
31.07.2014 21.06.2014
17.08.2014 21.06.2014
31.08.2014 21.06.2014
30.09.2014 21.06.2014
22.10.2014 21.06.2014
23.10.2014 21.06.2014
31.10.2014 21.06.2014

другими словами растянуть график на таблицу фактов.
уже весь мозг сломал, начал кружить расчетными итерационными методами, но на больших объемах проседает производительность.
спасибо огромное коллеги.
9 дек 14, 16:19    [16973019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить