Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Помогите с запросом   Найти похожие ветки 

 
unicode ©   (2004-04-16 08:59) [0]

SQL SERVER
21601 - это номер, Дальше идет дата, 1 и 2 это вход и выход
как видно из примера то даный номер производит вход и выход
т.е. 1 - это вход, 2 - это выход
но есть момент когда Вход не произошел но произошел Выход
(см. пример)
21601 2003-01-09 12:46:37 1
21601 2003-01-09 16:50:00 2
21601 2003-01-10 12:46:53 1
21601 2003-01-10 16:50:00 2
21601 2003-01-11 12:40:05 1
21601 2003-01-11 17:50:10 2
21601 2003-01-12 12:45:00 1
21601 2003-01-12 18:40:00 2
21601 2003-01-13 18:00:00 1 - Вход
21601 2003-01-13 23:00:00 2 - Выход
21601 2003-01-14 23:28:48 2 - Выход
21601 2003-01-15 19:04:36 2 - Выход

отсюда видно что на выделенные даты не было входа но был выход..
Задача такая как получить эти данные вот в таком виде
Причем тоже самое можеть быть и с выходом то есть Вход будет а выхода нет

Номер | Вход |Дата | Выход |Дата
Номер | Вход |Дата | Выход |Дата
Номер | NULL |NULL | Выход |Дата
Номер | NULL |NULL | Выход |Дата
Номер | Вход |Дата | NULL  |NULL

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

Кто-нибудь может помочь разобраться в этом? Да и записей в таблице больше 150000 .. и принаписании запроса мне кажеться лучше вообще не ссылаться на даты а пользоваться 1 и 2..


 
A_N_D ©   (2004-04-16 09:20) [1]

select t1.[Номер], t2.[Вход], t2.[Дата] as d1, t3.[Выход], t3.[Дата] as d2
from Table t1
left outer join table t2 on t2.номер=t1.номер and t2.Вход=1
left outer join table t3 on t3.номер=t1.номер and t3.Вход=2


 
unicode ©   (2004-04-16 09:23) [2]

сейчас попробуюю далеко не уходи..


 
unicode ©   (2004-04-16 09:27) [3]

неа не получилось прошло 30 секунд а запрос еще идет, я остановил, в таблице сейчас примерно 32000 записей а запрос который я остановил уже вернул 900000 записей ... не работает


 
ЮЮ ©   (2004-04-16 09:30) [4]

Хоть убейте, не понимаю, почему, когда явно напрашивается ЯВНАЯ связь между записями, не сделать её на уровне ДАННЫХ и не получать затем нужные пары "на лету", а не продолжать ежедневно насиловать сервер?


 
Johnmen ©   (2004-04-16 09:33) [5]

Примерно так:


SELECT T1.ID, T1.Z, T2.Z, T1.DT, MIN(T2.DT)
FROM Table T1
FULL JOIN Table T2 ON (T2.ID=T1.ID) AND
                  (T1.Z=1) AND (T2.Z=2) AND
                  (T1.DT<=T2.DT)
GROUP BY T1.ID, T1.Z, T2.Z, T1.DT


Z = 1-вход, 2-выход;
DT - датавремя


 
unicode ©   (2004-04-16 09:34) [6]

таблица одна... даты разные, неужели решения этой проблеме??


 
tERRORist ©   (2004-04-16 09:35) [7]

Да с такой организацией данных получить результат будет геморрно.
Тут всяко не обойтись без функции которая бы искала запись предыдущего типа(вход/выход), которая была всавлена до текущей и между ними нет записей текущего типа.


 
unicode ©   (2004-04-16 09:36) [8]

>> Johnmen

сейчас попробую...


 
A_N_D ©   (2004-04-16 09:42) [9]

select t1.[Номер], t1.[Вход], t1.[Дата] as d1, t2.[Выход], t2.[Дата] as d2, srt=case When t1.[Дата] is null then t2.[Дата] else t1.[Дата] end
from Table t1
inner join table t2 on t2.номер=t1.номер and t2.Вход=2 and t1.Вход=1
order by srt


 
unicode ©   (2004-04-16 09:48) [10]

>> Johnmen работает но не совсем правильно сейчас пример кину что сделал запрос вот данные на одну карту

27420 2004-03-01 08:59:01.000 1
27420 2004-03-02 09:02:31.000 1
27420 2004-03-02 11:33:10.000 2
27420 2004-03-02 15:32:31.000 2
27420 2004-03-03 18:09:58.000 2
27420 2004-03-04 09:00:51.000 1
27420 2004-03-05 09:07:23.000 1
27420 2004-03-05 14:12:06.000 2
27420 2004-03-09 09:03:34.000 1
27420 2004-03-10 15:04:33.000 2
27420 2004-03-11 09:06:59.000 1
27420 2004-03-12 09:05:01.000 1
27420 2004-03-15 09:04:33.000 1
27420 2004-03-16 09:12:51.000 1
27420 2004-03-17 09:14:28.000 1
27420 2004-03-17 13:42:11.000 2
27420 2004-03-18 13:56:17.000 2
27420 2004-03-19 09:09:52.000 1
27420 2004-03-19 13:18:21.000 2
27420 2004-03-23 09:14:04.000 1
27420 2004-03-23 13:48:50.000 2
27420 2004-03-24 08:55:51.000 1
27420 2004-03-24 14:06:47.000 2
27420 2004-03-25 08:59:01.000 1
27420 2004-03-26 09:01:19.000 1
27420 2004-03-29 11:30:16.000 1
27420 2004-03-30 09:07:11.000 1
а вот результат твое запроса

27420 1 2004-03-01 08:59:01.000 2 2004-03-02 11:33:10.000
27420 1 2004-03-04 09:00:51.000 2 2004-03-05 14:12:06.000
27420 1 2004-03-09 09:03:34.000 2 2004-03-10 15:04:33.000
27420 1 2004-03-11 09:06:59.000 2 2004-03-17 13:42:11.000 --
27420 1 2004-03-12 09:05:01.000 2 2004-03-17 13:42:11.000 --
27420 1 2004-03-15 09:04:33.000 2 2004-03-17 13:42:11.000 --
27420 1 2004-03-16 09:12:51.000 2 2004-03-17 13:42:11.000

-- обшибочные данные


 
tERRORist ©   (2004-04-16 09:49) [11]

Когда вы будете делать джойн он свяжет с друг другом записи которые вставились может еще десять лет назад, т.е. текущий выход он свяжет со всеми входами этого номера которые были до него, а надо самый близкий по дате. Мое мнение без функции не обойтись.


 
tERRORist ©   (2004-04-16 09:50) [12]

Вот именно от этого и дохренища записей...


 
Anatoly Podgoretsky ©   (2004-04-16 09:55) [13]

Нафига обрабатывать данные за несколько лет?
А за месяц не будет 150000


 
Johnmen ©   (2004-04-16 09:55) [14]

>unicode ©  

Ясно, что я привел не точный ответ, а указал основные моменты:
1. Поскольку записи "разворачиваем" в горизонталь, то соединение табл.себя с собой.
2. Поскольку NULL справа и слева, то FULL JOIN.
3. Чтобы выделить принадлежность ухода приходу, MIN.

Вобщем надо немного подумать и всё получится...
:)


 
ЮЮ ©   (2004-04-16 09:56) [15]

SELECT *
FROM
 (Select * from Table Where z=1) Enters
 FULL JOIN (Select * from Table Where z=2) Exits
ON
 Enters.Id = Exits.EnterID

где EnterID - недастоющее поле связи записи о выходе с записью о входе(может быть NULL, но тогда пусть охрана выясняет, как он пробрался незамеченным). Добавь его. В процедуре заполни его один раз. В программе добавления записей о выходе добавь его заполнение. И будет тебе счастье :-)


 
unicode ©   (2004-04-16 09:58) [16]

>> Johnmen
а что если использовать куркос для перебора записей и сверять предидущую со следуещей типа если 1 то отьрасывать слево а если после него идет 2 но его кинуть к 1 в правую часть если повторяються числа 1 то обе в лево а справа НУЛ нет?


 
Johnmen ©   (2004-04-16 10:13) [17]

>unicode ©

Ещё замечу, что построение корректного запроса интересно лишь как разминка для мозгов и тренировка.
А практически стоит просто написать ХП.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.036 c
1-1083426724
student87
2004-05-01 19:52
2004.05.16
Как обоити в цикле несколько компанентов?


3-1082385329
Vit
2004-04-19 18:35
2004.05.16
Какая функция преобразует Date в String


14-1082892916
Dimedrol
2004-04-25 15:35
2004.05.16
Хочу украсить прогу... :-)


3-1082189318
Koba
2004-04-17 12:08
2004.05.16
База данных


4-1080393046
Deb
2004-03-27 16:10
2004.05.16
Изменение размеров и перетаскивание объектов на форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский