SQL-запрос: разница во времени - PullRequest
0 голосов
/ 15 июля 2009

Этот вопрос покажется неубедительным для всех экспертов в представлениях SQL-сервера, но ...

Итак, у меня есть небольшой набор данных, которые нужны моему клиенту для составления отчетов. Я должен признать, что хотя я спрашивал их об их требованиях к отчетности, я до сих пор не вижу, что моя база данных может быть лучше оптимизирована.

Один из фрагментов данных, которые им нужны, - это разница во времени между двумя задачами, которые могли быть запущены:

select caseid, hy.createdate
from app_history hy
where hy.activityid in (303734, 303724)

Это дает мне две строки (после редактирования) для каждого случая, которые затем должны быть измерены; но несколько покачиваний: Действие 303734 будет всегда выполняться, действие 303724 может выполняться. Каждая комбинация 303734 и 303724 совпадает. Предположительно, у дела может быть 1 несоответствующий 303734 с подобранной парой впоследствии во 2 представлении. Соответствие им может быть до интуиции. Нехорошо. Может быть более одного представления для каждого caseid, и если это так, то оба действия будут выполняться каждый последующий раз. Нет способа записать номер представления в эту таблицу.

Таблица app_history содержит идентификаторы пользователя, регистра и активности в качестве внешних ключей. PK - это идентификатор столбца идентификации.

Есть ли лучший способ написать запрос?

После справки от КМ:

select
    c.id, c.submissionno, hya.caseid, hya.createtime, hyb.caseid, hyb.createtime
    ,CASE
         WHEN hyb.caseid IS NOT NULL THEN DATEDIFF(mi,hya.createtime,hyb.createtime)
         ELSE NULL
     END AS Difference 
    from app_case c
        inner join app_history hya on c.id = hya.caseid 
        left outer join  app_history hyb on c.id = hyb.caseid  
    where hya.activityid in (303734) and hyb.activityid in (303724) order by c.id asc

Это почти работает.

У меня теперь есть эта проблема:

460509|2|460509|15:15:39.000|460509|15:16:13.000|1
460509|2|460509|15:15:39.000|460509|15:18:13.000|3
460509|2|460509|15:17:52.000|460509|15:16:13.000|-1
460509|2|460509|15:17:52.000|460509|15:18:13.000|1

Итак, теперь я получаю 1 ряд, сравнивая каждый из двух для каждого из четырех рядов ... ммм, я думаю, это лучшее, на что я могу надеяться. (

Ответы [ 2 ]

1 голос
/ 15 июля 2009

ИСПОЛЬЗОВАТЬ ВЛЕВО СОЕДИНИТЬ

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM app_history                a
        LEFT OUTER JOIN app_history b ON b.activityid=303724
    WHERE a.activityid=303734

РЕДАКТИРОВАТЬ после чуть более подробной информации о схеме ...

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM (SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303734)                 aa
        INNER JOIN app_history                                                               a ON aa.MaxID=a.ID
        LEFT OUTER JOIN a(SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303724) bb ON 1=1
        LEFT OUTER JOIN app_history                                                          b ON bb.MaxID=b.ID
0 голосов
/ 15 июля 2009

сделать что-то вроде этого


select datediff(
day,
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303734),
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303724)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...