SQL Server 按开始时间从每个子组顺序获取最小和最大日期时间

x759pob2  于 2022-12-10  发布在  其他
关注(0)|答案(2)|浏览(138)

I basically want to group the set by timeline in SQL, I am so out of ideas right now obviously group by does not work and so does row number.
Any ideas for SQL are really appreciated.

select shift_date,associate_id,name,description , min(START_TRAN_DATE) as startdate, max(end_tran_date) as end_date
from ltu_vt 
group by shift_date,associate_id,name,description
**SHIFT_DATE    ID  NAME            DESC    START_TRAN_DATE         END_TRAN_DATE**
2022-11-13  42  John Doe    ADP 2022-11-13 06:31:00.000 2022-11-13 06:31:22.000
2022-11-13  42  John Doe    LINE    2022-11-13 06:31:22.000 2022-11-13 06:50:13.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:50:13.000 2022-11-13 06:50:13.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:52:13.000 2022-11-13 06:52:13.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:52:20.000 2022-11-13 06:52:20.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:52:25.000 2022-11-13 06:52:25.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:52:46.000 2022-11-13 06:52:46.000
2022-11-13  42  John Doe    BG  2022-11-13 06:53:58.000 2022-11-13 06:53:58.000
2022-11-13  42  John Doe    BG  2022-11-13 06:54:01.000 2022-11-13 06:54:01.000
2022-11-13  42  John Doe    HJ  2022-11-13 07:13:49.000 2022-11-13 07:13:49.000
2022-11-13  42  John Doe    P2L 2022-11-13 07:14:09.000 2022-11-13 07:14:09.000
2022-11-13  42  John Doe    P2L 2022-11-13 07:19:48.000 2022-11-13 07:19:48.000
2022-11-13  42  John Doe    ADP 2022-11-13 07:20:00.000 2022-11-13 07:20:00.000

expected output is

**SHIFT_DATE    ID  NAME            DESC   START_TRAN_DATE          END_TRAN_DATE**
2022-11-13  42  John Doe    ADP 2022-11-13 06:31:00.000 2022-11-13 06:31:22.000
2022-11-13  42  John Doe    LINE    2022-11-13 06:31:22.000 2022-11-13 06:50:13.000
2022-11-13  42  John Doe    HJ  2022-11-13 06:50:13.000 2022-11-13 06:52:46.000
2022-11-13  42  John Doe    BG  2022-11-13 06:53:58.000 2022-11-13 06:54:01.000
2022-11-13  42  John Doe    HJ  2022-11-13 07:13:49.000 2022-11-13 07:13:49.000
2022-11-13  42  John Doe    P2L 2022-11-13 07:14:09.000 2022-11-13 07:19:48.000
2022-11-13  42  John Doe    ADP 2022-11-13 07:20:00.000 2022-11-13 07:20:00.000
hs1rzwqc

hs1rzwqc1#

从预期输出来看,您似乎希望按description分组,因此可以这样做:

SELECT SHIFT_DATE,
       associate_id ID,
       Name
       description DESC,
       MIN(START_TRAN_DATE),
       MAX(END_TRAN_DATE)
FROM ltu_vt
GROUP BY SHIFT_DATE, ASSOCIATE_ID, DESCRIPTION

请注意,我唯一的信息是你给的信息,所以,如果我误解了问题,提供更多的信息,也许是SQL小提琴以及。

x6yk4ghg

x6yk4ghg2#

Please try the following solution.
It is a well known "gaps and islands" problem.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (SHIFT_DATE DATE, ID INT, [NAME] VARCHAR(20), [DESC] varchar(10), START_TRAN_DATE datetime, END_TRAN_DATE DATETIME);
INSERT @tbl (SHIFT_DATE, ID, NAME, [DESC], START_TRAN_DATE, END_TRAN_DATE) VALUES
('2022-11-13', 42, 'John Doe', 'ADP', '2022-11-13 06:31:00.000', '2022-11-13 06:31:22.000'),
('2022-11-13', 42, 'John Doe', 'LINE','2022-11-13 06:31:22.000', '2022-11-13 06:50:13.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 06:50:13.000',  '2022-11-13 06:50:13.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 06:52:13.000',  '2022-11-13 06:52:13.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 06:52:20.000',  '2022-11-13 06:52:20.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 06:52:25.000',  '2022-11-13 06:52:25.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 06:52:46.000',  '2022-11-13 06:52:46.000'),
('2022-11-13', 42, 'John Doe', 'BG', '2022-11-13 06:53:58.000',  '2022-11-13 06:53:58.000'),
('2022-11-13', 42, 'John Doe', 'BG', '2022-11-13 06:54:01.000',  '2022-11-13 06:54:01.000'),
('2022-11-13', 42, 'John Doe', 'HJ', '2022-11-13 07:13:49.000',  '2022-11-13 07:13:49.000'),
('2022-11-13', 42, 'John Doe', 'P2L', '2022-11-13 07:14:09.000', '2022-11-13 07:14:09.000'),
('2022-11-13', 42, 'John Doe', 'P2L', '2022-11-13 07:19:48.000', '2022-11-13 07:19:48.000'),
('2022-11-13', 42, 'John Doe', 'ADP', '2022-11-13 07:20:00.000', '2022-11-13 07:20:00.000');
-- DDL and sample data population, end

SELECT series, SHIFT_DATE, ID, NAME, [DESC], MIN(START_TRAN_DATE) AS Date_Start, MAX(END_TRAN_DATE) AS Date_End, COUNT(SHIFT_DATE) AS Shift_Counter
FROM
(
    SELECT *,
           SUM(IIF([DESC] <> ns, 1, 0)) OVER (ORDER BY START_TRAN_DATE) AS series
    FROM
    (
        SELECT series.*,
               LAG([DESC]) OVER (ORDER BY START_TRAN_DATE) AS ns
        FROM @tbl AS series
    ) q
) q
GROUP BY series, SHIFT_DATE, ID, NAME, [DESC]
ORDER BY series;

Output

seriesSHIFT_DATEIDNAMEDESCDate_StartDate_EndShift_Counter
02022-11-1342John DoeADP2022-11-13 06:31:00.0002022-11-13 06:31:22.0001
12022-11-1342John DoeLINE2022-11-13 06:31:22.0002022-11-13 06:50:13.0001
22022-11-1342John DoeHJ2022-11-13 06:50:13.0002022-11-13 06:52:46.0005
32022-11-1342John DoeBG2022-11-13 06:53:58.0002022-11-13 06:54:01.0002
42022-11-1342John DoeHJ2022-11-13 07:13:49.0002022-11-13 07:13:49.0001
52022-11-1342John DoeP2L2022-11-13 07:14:09.0002022-11-13 07:19:48.0002
62022-11-1342John DoeADP2022-11-13 07:20:00.0002022-11-13 07:20:00.0001

相关问题