Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7 8   вперед  Ctrl      все
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
declare @dl table (CarNumber int, SendDate datetime, ReceiveDate datetime, IDSourceSt int, IDDestSt int);

insert @dl values
(50000140,	'2012-11-16 14:49:13.000',	'2012-11-22 02:22:11.000',	4792,	 19745),
(50000140,	'2012-11-22 12:49:26.000',	'2012-11-28 01:16:18.000',	19745,    4792),
(50000140,	'2012-11-28 00:00:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-11-28 04:45:00.000',	'2012-11-28 04:56:19.000',	4792,	 4792),
(50000140,	'2012-11-28 06:46:30.000',	'2012-11-28 06:53:45.000',	4792,	 4792),
(50000140,	'2012-11-28 15:32:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-12-05 00:00:00.000',	'2012-12-12 00:00:00.000',	17652,    19745),
(50000140,	'2012-12-05 13:31:00.000',	'2012-12-12 00:00:00.000',	17652,   19745),
(50000140,	'2012-12-14 00:00:00.000',	'2012-12-19 00:00:00.000',	19745,    4792);

select * from @dl;

with cte as
(  select dl.CarNumber, dl.SendDate, dl.ReceiveDate, dl.IDSourceSt, dl.IDDestSt,
          row_number() over(partition by dl.CarNumber order by dl.SendDate) as rownum
   from @dl dl
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1
     inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c2.IdDestSt <> c1.IDSourceSt;

Только вот я не осилил назначение двух полей SendDate и ReceiveDate. Сдаётся мне, там надо искать ещё какие-нибудь вложенные периоды или что-то в этом роде.
28 мар 13, 14:07    [14107232]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Гость333,

select CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt from dl
where CarNumber = '50000140' and
SendDate between '20120101'and '20130327'

ORDER BY CarNumber,SendDate

with cte as
( select dl.CarNumber, dl.SendDate, dl.ReceiveDate, dl.IDSourceSt, dl.IDDestSt,
row_number() over(partition by dl.CarNumber order by dl.SendDate) as rownum
from dl
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c2.IdDestSt <> c1.IDSourceSt;

Ошибка: Сообщение 319, уровень 15, состояние 1, строка 7
Неправильный синтаксис около ключевого слова "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.
28 мар 13, 14:12    [14107272]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

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

Поставьте точку с запятой после "ORDER BY CarNumber,SendDate".
28 мар 13, 14:16    [14107299]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Синтаксические обозначения в Transact-SQL
;
Признак конца инструкции Transact-SQL. Хотя точка с запятой не требуется для большинства инструкций в данной версии SQL Server, она будет необходима в следующей версии.

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
28 мар 13, 14:20    [14107326]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Получилось 2 таблицы, первая моя, а вторая с 675619 строками... Не совсем понял что вышло)
28 мар 13, 14:22    [14107338]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

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

Добавьте в запрос, формирующий cte, условие "where CarNumber = '50000140' and SendDate between '20120101'and '20130327'".
28 мар 13, 14:33    [14107428]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Гость333
Синтаксические обозначения в Transact-SQL
;
Признак конца инструкции Transact-SQL. Хотя точка с запятой не требуется для большинства инструкций в данной версии SQL Server, она будет необходима в следующей версии.

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
ЯТД, когда реально потребуется - тогда и будем привыкать:)) А пока требуется только перед with :)
28 мар 13, 14:52    [14107607]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, получилось) Не могли бы вы в кратце объяснить теперь)

with cte as // я так понимаю создаем таблицу ( что такое as?
( select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,
row_number() over(partition by CarNumber order by SendDate) as rownum
from dl //Далее выбираем все наши колонки из таблицы dl сортируем по SendDate, а что означает partition by CarNumber
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 // присоединяем по формуле
where c2.IdDestSt <> c1.IDSourceSt and c2.CarNumber = '50000140'and c2.SendDate between '20120101'and '20130327';
28 мар 13, 14:53    [14107610]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Никто не подскажет?(
28 мар 13, 15:57    [14108192]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104760
PavelAA
Никто не подскажет?(

т.е. вам все в запросе понятно, кроме этого as ?
28 мар 13, 16:02    [14108231]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory,
with cte as // я так понимаю создаем таблицу ( что такое as?
from dl //Далее выбираем все наши колонки из таблицы dl сортируем по SendDate, а что означает partition by CarNumber
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)
28 мар 13, 16:03    [14108250]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104760
http://msdn.microsoft.com/en-us/library/bb510741%28v=sql.105%29.aspx
28 мар 13, 16:05    [14108271]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

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

CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

PARTITION BY - это часть вызова оконных (windowed) функций - читайте BOL про OVER()

с1 - это алиас (псевдоним). Подробности - опять же в BOL.
28 мар 13, 16:09    [14108312]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Glory
http://msdn.microsoft.com/en-us/library/b510741%28v=sql.105%29.aspx
ТСу, небось, понятнее

http://msdn.microsoft.com/ru-ru/library/bb510741%28v=sql.105%29.aspx

будет?
28 мар 13, 16:11    [14108332]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, буду читать!
28 мар 13, 16:13    [14108353]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено(
28 мар 13, 16:25    [14108483]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104760
PavelAA
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено

Тогда может не стоит программировать ?
А то там в синтаксисе кроме AS еще более мудреные слова есть.
28 мар 13, 16:26    [14108502]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
28 мар 13, 16:28    [14108519]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
PavelAA
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено(
Зайдите вот сюда:
http://msdn.microsoft.com/ru-ru/library/bb510741(v=sql.100).aspx
Найдите в списке слева SELECT - и прочитайте (по ссылкам внутри походите)
Там и про CTE, и про алиасы.
28 мар 13, 16:33    [14108558]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость333
iap
CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
Но правильнее "Общее", не находите?
В смысле "общее для данной инструкции (SELECT, DELETE, INSERT, UPDATE, MERGE)"
28 мар 13, 16:35    [14108575]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Гость333
пропущено...

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
Но правильнее "Общее", не находите?
В смысле "общее для данной инструкции (SELECT, DELETE, INSERT, UPDATE, MERGE)"
Хотя, наверно, я неправ
28 мар 13, 16:36    [14108582]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)

Как уже сказали, c1 — это псевдоним для cte. Без псевдонимов никак не обойтись, если в запросе одна и та же таблица используется более одного раза (скажем, тут cte используется два раза — без псевдонимов сервер не может узнать, из какого именно "cte" ему нужно взять тот или иной столбец). Также псевдонимы используют, например, для упрощения читабельности кода, упрощения дальнейшей модификации кода и т.д.
28 мар 13, 16:36    [14108586]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Но правильнее "Общее", не находите?

Может, и правильнее — я тоже называю его "общим" :-)
Также как индекс называю "кластерным", хотя в BOL он "кластеризованный".
Я просто на тот случай, если человек наберёт в Гугле "общее табличное выражение" и не найдёт ссылки на BOL.
28 мар 13, 16:39    [14108610]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, прочел, объяснили, стало понятнее) а вот эта строка
row_number() over(partition by CarNumber order by SendDate) as rownum
28 мар 13, 16:41    [14108622]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
Гость333
Синтаксические обозначения в Transact-SQL
пропущено...

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
ЯТД, когда реально потребуется - тогда и будем привыкать:)) А пока требуется только перед with :)

Ну вообще, как я понял, Microsoft пытается приучить ставить точки с запятой. Кроме WITH, они также нужны перед SEND, RECEIVE, может, ещё перед какими-то новыми ключевыми словами. Также, если некто привык писать точку с запятой перед WITH, этот некто может потом удивляться, почему падает создание представления:
CREATE VIEW xxx AS
; WITH cte AS (...)
SELECT * FROM cte;
:-)

Да и вообще, как-то это некрасиво выглядит (строго ИМХО, конечно).
28 мар 13, 16:44    [14108652]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7 8   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить