-1

我需要将表中的列插入NIP,NAME,DEPARTMENT,STATUSIN,STATUSOUTDAILYDATAWH具有SUMMARYDATAWHERE 条件的表中,这是我的查询:

INSERT INTO SUMMARYDATA(NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT  NIP, NAME, DEPARTMENT, STATUSIN = MIN(d.STATUSIN), STATUSOUT = MAX(d.STATUSOUT)
FROM DAILYDATAWH d
WHERE LEFT(STATUSIN,13)=LEFT(STATUSOUT,13)
GROUP BY NIP, NAME, DEPARTMENT

它实际上是有效的。但是,我想在没有 GROUP BY 的情况下使用 WHERE 条件,这可能吗?因为有些数据NIP, NAME, DEPARTMENT与其他数据相同。如何解决问题?

这是对样本数据的查询,将值插入表中DAILYDATAWH

INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT) 
VALUES 
    ('A1', 'ARIA', 'BB', '1/21/2020 8:00:00 AM', '1/21/2020 8:06:22 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020  8:16:07 AM', '1/21/2020  9:51:21 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020 10:00:00 AM', '1/21/2020 10:06:22 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020  11:16:07 AM', '1/21/2020  12:51:21 AM'),
    ('A1', 'ARIA', 'BB', '1/22/2020 8:05:00 AM', '1/22/2020 8:15:22 AM'),
    ('A1', 'ARIA', 'BB', '1/22/2020  9:20:07 AM', '1/22/2020  10:00:21 AM');

对于表中的以下示例数据,DAILYDATAWH这是我想要在表中的示例输出SUMMARYDATA

输出

4

3 回答 3

2

您可以使用窗口功能:

INSERT INTO SUMMARYDATA(NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
     SELECT DISTINCT d.NIP, d.NAME, d.DEPARTMENT,
            MIN(d.STATUSIN) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSIN)) as STATUSIN,
            MAX(d.STATUSOUT) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSOUT)) as STATUSOUT
     FROM DAILYDATAWH d;
于 2020-02-25T09:20:55.787 回答
0

您可以使用排名功能来实现。

;WITH CTE_Status AS
(SELECT  NIP, NAME, DEPARTMENT, StatusIn, StatusOut ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT,CAST(StatusIn AS Date) ORDER BY d.STATUSIN) AS StatusIn_rnk, ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT, CAST(StatusIn AS Date) ORDER BY d.STATUSOUT DESC) AS StatusOut_rnk
FROM DAILYDATAWH d
)
SELECT a.NIP, a.Name, a.Department,a.StatusIn, b.StatusOut 
FROM CTE_Status AS a
JOIN CTE_Status AS b
ON a.StatusIn_rnk = b.StatusOut_rnk
WHERE a.StatusIn_rnk = 1;
于 2020-02-25T09:29:07.780 回答
0

要获得所需的结果,即 NIP、NAME、DEPARTMENT 的 Min STATUSIN 和 Max STATUSOUT,最好和最简单的方法(对我来说)是使用 GROUP BY,即使您使用窗口函数也可以完成

INSERT INTO SUMMARYDATA(NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT  NIP, NAME, DEPARTMENT, MIN(STATUSIN), MAX(STATUSOUT)
FROM DAILYDATAWH d
WHERE CAST(STATUSIN as date) = CAST(STATUSOUT AS date)
GROUP BY NIP, NAME, DEPARTMENT

正如评论中所建议的那样,将您的字符串转换为实际日期以避免出现问题,如下所述

--in your original query you use
{...} WHERE LEFT(STATUSIN,13) = {...}
-- which i.e. translates to
SELECT LEFT ('1/21/2020 8:00:00 AM',13)
which result is '1/21/2020 8:0', so it actually compares date, hour and part of the minutes
-- another example
SELECT LEFT ('1/21/2020 10:00:00 AM',13) 
results in '1/21/2020 10:', so this case compares only date and hour

如您所见,这是您要避免的事情

于 2020-02-25T09:09:33.967 回答