Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
1-1083187607
Sergix
2004-04-29 01:26
2004.05.16
проблемы с DLL


1-1083243254
Эдуард
2004-04-29 16:54
2004.05.16
Компонент анализа строки с формулой


1-1083387988
SHS
2004-05-01 09:06
2004.05.16
Application.Exename в DLL


7-1080727290
-+= Evgeney =+-
2004-03-31 14:01
2004.05.16
Извращения с сотовым телефоном


7-1081254089
_Вован_
2004-04-06 16:21
2004.05.16
Как программно узнать, минимизировано ли главное окно приложения?