选择记录并从同一个表中获取closeTime和OpenTime

时间:2015-06-18 14:28:39

标签: sql sql-server

我有下表:

enter image description here

我想要的是以下结果:

InteractionID - OpenTime - CloseTime

Opentime是DATE_STAMP UPDATE_TYPE = "Open"DATE_STAMP CloseTime是UPDATE_TYPE = "Close" Select DISTINCT A.INTERACTION_ID as idd, (Select B.DATE_STAMP from dbo.SD_INTERACTIONS_HISTORY B WHERE B.UPDATE_TYPE = 'Open' and B.INTERACTION_ID = A.INTERACTION_ID) as OpenTime, (Select TOP 1 C.DATE_STAMP from dbo.SD_INTERACTIONS_HISTORY C WHERE C.UPDATE_TYPE = 'Close' and C.INTERACTION_ID = A.INTERACTION_ID) as CloseTime from dbo.SD_INTERACTIONS_HISTORY A where DATEPART(year, A.DATE_STAMP) > 2014

我有以下SQL查询:

function PanelViewVM() {
var self = this;

self.PanelName = ko.observable("Test");
self.PanelDetails = ko.observableArray([]),

self.SelectPanel = function () {

    $.ajax("/DPanel/FillIndex", {

        dataType: 'json',
        contentType: 'application/json',
        success: function (data) {

            ko.mapping.fromJS(data.PanelDetails, {}, self.PanelDetails);

        },
        error: function (data) {
            console.log(data);
        }
    });

};



self.SelectPanel();

它工作得很好,但我有 2个问题:

  1. 这是正确的方法吗?这似乎是一个缓慢的查询,所以也许有一种方法来优化它?
  2. 而不是检查日期戳是否>比2014年,我想找到OpenTime少于30​​天的结果,我该怎么做?
  3. 我正在使用SQL Server 2008

5 个答案:

答案 0 :(得分:1)

这样的事情?

SELECT
    INTERACTION_ID,
    update_open,
    update_close,
    datediff('d',update_open,update_close) AS diff
FROM
    (SELECT 
        INTERACTION_ID,
        MAX(CASE WHEN update_type = 'Open' THEN DATE_STAMP ELSE NULL END) AS update_open,
        MAX(CASE WHEN update_type = 'Close' THEN DATE_STAMP ELSE NULL END) AS update_close
    FROM    
        SD_INTERACTIONS_HISTORY
    WHERE
        DATEPART(YEAR, DATE_STAMP) > 2014 AND
        UPDATE_TYPE IN('Open','Close')
    GROUP BY
        INTERACTION_ID) mx
WHERE
    datediff('d',update_open,update_close)  < 30

答案 1 :(得分:1)

您可以自己加入表格。

首先是开放记录,然后加入已关闭的记录。

SELECT 
    O.INTERACTION_ID,
    O.DATE_STAMP DATE_STAMP_OPEN,
    C.DATE_STAMP DATE_STAMP_CLOSE
FROM dbo.SD_INTERACTIONS_HISTORY O
INNER JOIN dbo.SD_INTERACTIONS_HISTORY C ON
    O.INTERACTION_ID = C.INTERACTION_ID AND
    O.UPDATE_TYPE = "Open" AND
    C.UPDATE_TYPE = "Closed" 
WHERE 
    O.DATE_STAMP > DATEADD(DAY,-30,GETDATE())

如果要定义日期,可以用变量替换GETDATE。

使用内部联接,您只能获得“完整记录”打开和关闭。

使用Left,您将获得仍处于打开状态的记录。

答案 2 :(得分:1)

您可以尝试此查询

SELECT DISTINCT A.INTERACTION_ID as idd,
    A.DATE_STAMP AS OpenTime,
    B.DATE_STAMP AS CloseTime,
FROM dbo.SD_INTERACTIONS_HISTORY A
    JOIN dbo.SD_INTERACTIONS_HISTORY B ON A.INTERACTION_ID = B.INTERACTION_ID
    AND A.UPDATE_TYPE = 'Open'
    AND B.UPDATE_TYPE = 'Close'
WHERE DATEDIFF(DAY,A.DATE_STAMP,GETDATE())<30

答案 3 :(得分:1)

嗯,你现在有一些选择,我只会再投入一个:

;With CTE AS 
(
    SELECT INTERACTION_ID,
            CASE WHEN UPDATE_TYPE = 'open' THEN
            DATE_STAMP
            END As OpenTime,
            CASE WHEN UPDATE_TYPE = 'close' THEN
            DATE_STAMP
            END As CloseTime

    FROM SD_INTERACTIONS_HISTORY
    WHERE UPDATE_TYPE IN('open', 'close')
)

SELECT INTERACTION_ID, MAX(OpenTime) As OpenTime, MAX(CloseTime) As CloseTime
FROM CTE
GROUP BY INTERACTION_ID

(就个人而言,我更喜欢自我加入选项,但我已经这样写了......)

答案 4 :(得分:0)

您可以使用某些加入条件和DATE子句进行WHERE比较,如下所示:

CREATE TABLE #interactions
    (
      id INT ,
      date_stamp DATETIME ,
      update_type NVARCHAR(10)
    )

INSERT  INTO #interactions
        ( id, date_stamp, update_type )
VALUES  ( 1, DATEADD(DAY, -2, GETDATE()), 'Open' ),
        ( 1, DATEADD(DAY, -1, GETDATE()), 'Update' ),
        ( 1, GETDATE(), 'Close' )

SELECT DISTINCT
        i.id ,
        iOpen.date_stamp OpenTime ,
        iClose.date_stamp CloseTime
FROM    #interactions i
        INNER JOIN #interactions iOpen ON iOpen.id = i.id
                                          AND iOpen.update_type = 'Open'
        INNER JOIN #interactions iClose ON iClose.id = i.id
                                           AND iClose.update_type = 'Close'
WHERE   iOpen.date_stamp >= DATEADD(DAY, -30, GETDATE())

DROP TABLE #interactions