Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - украшаем запрос MS SQL

Ответить
Настройки темы
Разное - украшаем запрос MS SQL
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


1. можно ли как-то запустить Query Analyzer (2000) с ярлычка, чтоб он не заново запускался, а создал окошко в уже открытом аналайзере? А то задолбал плодиться, я забываю смотреть, есть он в живых или нет.

2. есть уже заполненная табличка:
Код: Выделить весь код
declare @dates1 table (
  recId     integer,  // прочая информация
  groupId  integer, // поле для группировки
  dateIn    datetime,  // начало отрезка времени
  dateOut   datetime); // конец отрезка времени
нужно оставить в ней записи, имеющие хотя бы одно пересечение с другими при одинаковой groupId. Остальные удалить. Я сделал, но мне кажтся чёто как-то некрасиво и медленно, через delete where not exists(...). Сами понимаете, некрасивые самолёты не летают. Есть варианты как причесать запрос?

Отправлено: 15:18, 15-09-2008

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


для MS SQL есть свой раздел форума
2. сразу сделать правильную (необходимую) выборку. Временные таблицы - очень ресурсоёмкое решение, так ли они нужны в данном случае?

Отправлено: 16:31, 15-09-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата:
для MS SQL есть свой раздел форума
Можно тему туда перенести? Я не заметил раздела

Может я неправильно понимаю как оно работает, обрисую задачу:
Есть табличка с оплаченными повременными услугами, примерно миллион-два записей (с 2004 года). Из них нужно выбрать такие записи за последние 4 недели, которые бы оплачивали одну и ту же услугу в одно и то же время, то есть выяснить какие есть перекрытия оплат.
Табличка имеет много всяких полей, я выбрал только нужные 4 поля за последние недели (около 1000 строчек), а потом искал пересечения
Код: Выделить весь код
delete from
    @dates
from
    @dates debet1
where
    not exists (
        select * from @dates debet2
        where
	    debet1.recId <> debet2.recId
	    and debet1.groupId = debet2.groupId
            and debet1.dateIn < debet2.dateOut
            and debet2.dateIn < debet1.dateOut);
А можно ли как-то создать временный view? чтобы съэкономить и упонятнить код

Отправлено: 06:46, 16-09-2008 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


pva
1. Запускать скриптом, который проверяет наличие QA и либо запускает, либо активирует окно и отправляет комбинацию <Ctrl+N>

Отправлено: 13:12, 16-09-2008 | #4


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


pva, я бы всё-таки работал с изначальной таблицей
где-то примерно так:
Код: Выделить весь код
select groupId, дата, count (*)
  from услуги
  where дата>'2008-08-15'
  group by groupId, дата
  having count (*)>1
на выходе получаем список перекрытий
(в примере не понял соотношение dateIn и dateOut)

Отправлено: 14:58, 16-09-2008 | #5

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


дело в том, что граница оказания услуг может быть и не кратна дню, пример:
услуга 1: от '2008-01-01 12:00:00' до '2008-01-02 14:00:00'
услуга 2: от '2008-01-01 18:00:00' до '2008-01-02 12:00:00'

Отправлено: 16:55, 16-09-2008 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


т.е. имеем ряд временных диапазонов, нужно выбрать накладывающиеся? - да, группировкой тут не обойтись :-(
хотя всё равно не такой уж и монстрообразный запрос получается:
Код: Выделить весь код
select u1.*
  from
    услуги u1, услуги u2
  where
    u1.dateIn>'2008-08-15' and u2.dateIn>'2008-08-15' -- 4 недели назад - лучше вынести в переменную
    and u1.groupId=u2.groupId2 and u1.recId<>u2.recId
    and (u1.dateIn beetwen u2.dateIn and u2.dateOut or u1.dateOut beetwen u2.dateIn and u2.dateOut)

Отправлено: 20:11, 16-09-2008 | #7

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Busla, Я приведу пример когда этот вариант не работает:
Код: Выделить весь код
and (u1.dateIn beetwen u2.dateIn and u2.dateOut or u1.dateOut beetwen u2.dateIn and u2.dateOut)

     .....время................
  u1    1111111111111111111
  u2        2222222222222
ни начало ни конец u1 не входят в u2.
теперь из каких соображений я делал:
Код: Выделить весь код
  u1        11111111111111
  u2          222222222222222

  1. если u2 начнётся после того, как u1 закончится - нет пересечения.
  2. если u1 начнётся после того, как u2 закончится - нет пересечения.
  3. иначе пересекаются.

упрощаем условие:

     not (u2.dateOut <= u1.dateIn or u1.dateOut <= u2.dateIn) -->
--> u2.dateOut > u1.dateIn and u1.dateOut > u2.dateIn -->
--> u1.dateIn < u2.dateOut and u2.dateIn < u1.dateOut
Насчёт выборки действительно ступил - заработался. Всё действиетльно можно одним несложным селектом сделать. На сегодня такой вариант:
Код: Выделить весь код
select
    u1.recId,
    u1.groupId,
    u1.dateIn,
    u1.dateOut
from
    услуги u1
    join услуги u2 on (
        getDate() - 4*7 <= u2.dateIn
        and u1.groupId = u2.groupId
        and u1.dateIn < u2.dateOut
        and u2.dateIn < u1.dateOut
        and u1.recId <> u2.recId)
where
    getDate() - 4*7 <= u1.dateIn;
order by
    u1.groupId,
    u1.dateIn

Отправлено: 22:12, 16-09-2008 | #8


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


pva, всё правильно. Ты просто забываешь, что помимо
Код: Выделить весь код
.....время................
  u1    1111111111111111111
  u2        2222222222222

будет и обратная пара:

  u1        2222222222222
  u2    1111111111111111111

Отправлено: 14:44, 17-09-2008 | #9

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


не-а, не забываю :-P если список состоит только из этих двух записей, то твой вариант запроса выдаст только одну. А надо обе (это всё необходимо для отчёта, чтобы потом человек посмотел пересечения и принял решение, что из них поправить)

Отправлено: 06:44, 18-09-2008 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - украшаем запрос MS SQL

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочие БД - SQL запрос на выборку по дате echo off Программирование и базы данных 1 10-06-2009 01:15
Delphi - [решено] SQL-запрос на Delphi FRZ Программирование и базы данных 2 16-04-2009 15:42
sql запрос E-mail Вебмастеру 20 30-12-2006 22:31
SQL запрос pauluss Вебмастеру 5 11-06-2004 09:14
SQL-запрос anridir Программирование и базы данных 2 23-09-2002 07:11




 
Переход