我有下表:
我想要的是以下结果:
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个问题:
我正在使用SQL Server 2008
答案 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