Microsoft SQL Server 2016 - T-SQL 语言 - 'Gaps & Islands' 问题 - 棘手的分区
Microsoft SQL Server 2016 - T-SQL language - 'Gaps & Islands' problem - tricky partition
我有 5 名员工 ID 值:111、222、333、444、555。
我有一个源数据集,其中包含 2021 年 3 月 28 日至 2021 年 4 月 5 日之间所有日历日的所有五个数据。(这只是我实际数据的一小部分样本)。
您可以使用这些脚本查看源数据示例:
CREATE TABLE #SourceDataset
(
EmployeeId int,
PayGroupName varchar(100),
PayTypeName varchar(100),
SiteName varchar(100),
Region varchar(100),
PercentageScore int,
Center int,
[Function] varchar(100),
Department varchar(100),
EverySingleCalendarDate date
)
--- for Employee ID = 111 ---
INSERT INTO #SourceDataset
VALUES (111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/28/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/29/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/30/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/31/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '4/1/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/2/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/2/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/3/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/3/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/4/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/4/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/5/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/5/2021')
--- for Employee ID = 111 ---
--- for Employee ID = 222 ---
INSERT INTO #SourceDataset
VALUES
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/28/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/29/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/30/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '3/31/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '4/1/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/2/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/2/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/4/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/5/2021')
--- for Employee ID = 222 ---
--- for Employee ID = 333 ---
INSERT INTO #SourceDataset
VALUES
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/28/2021'),
(333, 'Weekly PT', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/29/2021'),
(333, 'Weekly PT', 'Temporary', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/30/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/31/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '4/1/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/2/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/2/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/3/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/3/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/4/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/4/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/5/2021')
--- for Employee ID = 333 ---
--- for Employee ID = 444 ---
INSERT INTO #SourceDataset
VALUES
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/28/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/29/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/30/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/31/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '4/1/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/2/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/2/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 65, 29, 'RR', 'FG', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 35, 37, 'QQ', 'FG', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/5/2021')
--- for Employee ID = 444 ---
--- for Employee ID = 555 ---
INSERT INTO #SourceDataset
VALUES
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/28/2021'),
(555, 'WeeklyOptional', 'PT', 'StoreHouse2', 'RIC', 100, 19, 'WQ', 'FG', '3/29/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/30/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/31/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '4/1/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/3/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 23, 'BB', 'MA', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 24, 'CV', 'RU', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 34, 25, 'FJ', 'BN', '4/4/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/5/2021')
--- for Employee ID = 555 ---
SELECT *
FROM #SourceDataset
ORDER BY EmployeeId, EverySingleCalendarDate
---------------------------------------------------
目标:我正在尝试跟踪员工如何在一段时间内获得 100% 的百分比分数,并开发组来显示此信息,使用新的 MinDate 和 MaxDate 列,显示组存在的日期范围。在此处提到的时间段内(2021 年 3 月 28 日 - 2021 年 4 月 5 日),任何员工的日历天数都没有差距。
关于源数据集的注释:
一名员工在给定日历日的一行中可能会获得 100% 的百分比分数,在每一列(中心、职能、部门)下各有一个唯一值。或者,她可能会在另一个日历日获得 100% 的百分比分数,这 3 列的不同组合 - 中心、职能、部门 - 在多行中,以百分比拆分
分数(例如,三行中的 40 + 25 + 35(或)两行中的 50 + 50),这将在该日历日加起来为 100%。请参阅源数据集上的示例查询以了解我的意思。
源数据集的开发方式是 - 每个日历日必须占任何员工的 100%,并且日历日之间没有差距。对于员工,这 4 个列(PayGroupName、PayTypeName、SiteName、Region)的更改仅发生在日历日级别,而不是在 PercentageScore 列级别或 Center、Function、Department 列级别。
Example:
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 111
AND EverySingleCalendarDate = '2021-03-28'
--100 % Percentage Score in one row--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 111
AND EverySingleCalendarDate = '2021-04-02'
--100 % Percentage Score in two rows (50 + 50)--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 555
AND EverySingleCalendarDate = '2021-04-02'
--100 % Percentage Score in three rows (40 + 25 + 35)--
我的目标是跟踪每位员工在一段时间内如何获得 100% 的百分比分数 - 从 3 月 28 日到 4 月 5 日,所有这些天我所有 5 名员工的数据都可用,没有差距源数据集中的日历日。
员工在给定日历日的行数将取决于她如何获得 100% 的百分比分数,无论是在一行中
或多行。 'number of rows'(在任何员工的日历日)基本上取决于 3 列的集合 - 中心、职能、部门。
另一个要点:列 - PayGroupName、PayTypeName、SiteName、Region - 在给定的日历日对于员工始终具有一个唯一值。因此,给定日历上员工的行数不是由这些列决定的 - PayGroupName、PayTypeName、SiteName、Region。
也就是说,每个列(PayGroupName、PayTypeName、SiteName、Region)下的数据可能会在员工的日历日之间发生变化,我们也需要对此进行跟踪。请参阅下面源数据集的示例查询:
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 333
AND EverySingleCalendarDate BETWEEN '2021-03-28' AND '2021-03-30'
--PayGroupName and PayTypeName change between days for this employee (333)--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 555
AND EverySingleCalendarDate BETWEEN '2021-04-03' AND '2021-04-04'
/*
PayGroupName and SiteName change between days for this employee (555);
and its' very important to to note that for an employee, the change for these 4 columns
(PayGroupName, PayTypeName, SiteName, Region) can happen only at the calendar day level, NOT at the
level of Percentage Score or at the level of the columns - Center, Function, Department.
In essence, the change for these 4 columns (PayGroupName, PayTypeName, SiteName, Region) for an
employee can happen ONLY at the level of a calendar day.
*/
几周前,我在同一个 上发布了一个问题,但数据集更简单,在任何给定日历日的员工只有一行。
今天,我遇到了类似但具有挑战性的情况,在这种情况下,在给定的日历日,一名员工可能有多个行。这是基于员工(比如员工 ID = 111)如何获得
100% 百分比分数,对于一个日历日,比如 2021 年 3 月 28 日。
我有所需的输出数据集,作为使用 T-SQL 的临时 table 和表格输出,这样您就可以清楚地了解我遇到的问题手.
期望输出:
CREATE TABLE #DesiredOutput
(
EmployeeId int,
PayGroupName varchar(100),
PayTypeName varchar(100),
SiteName varchar(100),
Region varchar(100),
PercentageScore int,
Center int,
[Function] varchar(100),
Department varchar(100),
MinDate date,
MaxDate date
)
INSERT INTO #DesiredOutput
VALUES
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/28/2021', '4/1/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/2/2021', '4/5/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/2/2021', '4/5/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/28/2021', '3/30/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '3/31/2021', '4/1/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/2/2021', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/2/2021', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/4/2021', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(333, 'Weekly PT', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/29/2021', '3/29/2021'),
(333, 'Weekly PT', 'Temporary', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/30/2021', '3/30/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/31/2021', '4/1/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/2/2021', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/2/2021', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/29/2021', '3/30/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/31/2021', '4/1/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/2/2021', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/2/2021', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 65, 29, 'RR', 'FG', '4/4/2021', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 35, 37, 'QQ', 'FG', '4/4/2021', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/5/2021', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(555, 'WeeklyOptional', 'PT', 'StoreHouse2', 'RIC', 100, 19, 'WQ', 'FG', '3/29/2021', '3/29/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/30/2021', '4/1/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/2/2021', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/2/2021', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/2/2021', '4/3/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 23, 'BB', 'MA', '4/4/2021', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 24, 'CV', 'RU', '4/4/2021', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 34, 25, 'FJ', 'BN', '4/4/2021', '4/4/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/5/2021', '4/5/2021')
SELECT *
FROM #DesiredOutput
ORDER BY EmployeeId, MinDate
我需要使用#SourceDataset 并将其转换为#DesiredOutput。
我需要一些建议。
例如,对于一名员工 (111) 和所有员工,#DesiredOutput(表格形式)如下所示:
EmployeeId
PayGroupName
PayTypeName
SiteName
Region
PercentageScore
Center
Function
Department
MinDate
MaxDate
111
Biweekly
Salaried
Shop Floor
NYC
100
17
WQ
FG
3/28/2021
4/1/2021
111
Biweekly
Salaried
Shop Floor
NYC
50
56
WQ
FG
4/2/2021
4/5/2021
111
Biweekly
Salaried
Shop Floor
NYC
50
80
WQ
FG
4/2/2021
4/5/2021
EmployeeId
PayGroupName
PayTypeName
SiteName
Region
PercentageScore
Center
Function
Department
MinDate
MaxDate
111
Biweekly
Salaried
Shop Floor
NYC
100
17
WQ
FG
3/28/2021
4/1/2021
111
Biweekly
Salaried
Shop Floor
NYC
50
56
WQ
FG
4/2/2021
4/5/2021
111
Biweekly
Salaried
Shop Floor
NYC
50
80
WQ
FG
4/2/2021
4/5/2021
222
Monthly
PartTime
Office Room
POR
100
19
WQ
FG
3/28/2021
3/30/2021
222
Monthly
PartTime
Office Room
POR
100
20
WR
FY
3/31/2021
4/1/2021
222
Monthly
PartTime
Office Room
POR
25
19
RH
FG
4/2/2021
4/3/2021
222
Monthly
PartTime
Office Room
POR
75
19
DP
FG
4/2/2021
4/3/2021
222
Monthly
PartTime
Office Room
POR
100
19
WQ
FG
4/4/2021
4/5/2021
333
Weekly
Contract
Store
ATL
100
19
WQ
FG
3/28/2021
3/28/2021
333
WeeklyPT
Contract
Store
ATL
100
19
WQ
FG
3/29/2021
3/29/2021
333
WeeklyPT
Temporary
Store
ATL
100
19
WQ
FG
3/30/2021
3/30/2021
333
Weekly
Contract
Store
ATL
100
19
WQ
FG
3/31/2021
4/1/2021
333
Weekly
Contract
Store
ATL
40
19
WQ
PQ
4/2/2021
4/5/2021
333
Weekly
Contract
Store
ATL
60
19
WQ
AD
4/2/2021
4/5/2021
444
Weekly
FT
StoreHouse
MIA
100
19
WQ
FG
3/28/2021
3/28/2021
444
Weekly
FT-Optional
StoreHouse
MIA
100
19
WQ
FG
3/29/2021
3/30/2021
444
Weekly
FT
StoreHouse
MIA
100
19
WQ
FG
3/31/2021
4/1/2021
444
Weekly
FT
StoreHouse
MIA
50
10
AB
FG
4/2/2021
4/3/2021
444
Weekly
FT
StoreHouse
MIA
50
11
HP
FG
4/2/2021
4/3/2021
444
Weekly
FT
StoreHouse
MIA
65
29
RR
FG
4/4/2021
4/4/2021
444
Weekly
FT
StoreHouse
MIA
35
37
QQ
FG
4/4/2021
4/4/2021
444
Weekly
FT
StoreHouse
MIA
50
10
AB
FG
4/5/2021
4/5/2021
444
Weekly
FT
StoreHouse
MIA
50
11
HP
FG
4/5/2021
4/5/2021
555
Weekly
FT
StoreHouse1
RIC
100
19
WQ
FG
3/28/2021
3/28/2021
555
WeeklyOptional
PT
StoreHouse2
RIC
100
19
WQ
FG
3/29/2021
3/29/2021
555
Weekly
FT
StoreHouse1
RIC
100
19
WQ
FG
3/30/2021
4/1/2021
555
Weekly
FT
StoreHouse1
RIC
40
23
BB
MA
4/2/2021
4/3/2021
555
Weekly
FT
StoreHouse1
RIC
25
24
CV
RU
4/2/2021
4/3/2021
555
Weekly
FT
StoreHouse1
RIC
35
25
FJ
BN
4/2/2021
4/3/2021
555
Weekly-NonOPTional
FT
StoreHouse156
RIC
33
23
BB
MA
4/4/2021
4/4/2021
555
Weekly-NonOPTional
FT
StoreHouse156
RIC
33
24
CV
RU
4/4/2021
4/4/2021
555
Weekly-NonOPTional
FT
StoreHouse156
RIC
34
25
FJ
BN
4/4/2021
4/4/2021
555
Weekly
FT
StoreHouse1
RIC
40
23
BB
MA
4/5/2021
4/5/2021
555
Weekly
FT
StoreHouse1
RIC
25
24
CV
RU
4/5/2021
4/5/2021
555
Weekly
FT
StoreHouse1
RIC
35
25
FJ
BN
4/5/2021
4/5/2021
关于如何开发所需输出的任何想法?
下端的table数据是完整的table,可能难以翻阅;所以我在顶部有一个较小版本的 Employee ID = 111,然后是整个所需的输出。或者,您可以使用 T-SQL 脚本 了解#DesiredOutput 数据集。
使用的方法:
- 正在计算一个标志以指示间隔超过 1 天。
- 根据总和标志创建排名。
- 分组,包括计算出的排名。
SELECT EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department
, MIN(EverySingleCalendarDate) MinDate
, MAX(EverySingleCalendarDate) MaxDate
INTO #tmpResults
FROM (
SELECT *
, Rnk = SUM(Flag) OVER (PARTITION BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department ORDER BY EverySingleCalendarDate)
FROM
(
SELECT *
, Flag = IIF(1=DATEDIFF(day, LAG(EverySingleCalendarDate) OVER (PARTITION BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department ORDER BY EverySingleCalendarDate), EverySingleCalendarDate),0,1)
FROM #SourceDataset
) q1
) q2
GROUP BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department, Rnk
ORDER BY EmployeeId, MinDate;
SELECT * FROM #tmpResults;
--
-- Differences
--
SELECT * FROM #tmpResults
EXCEPT
SELECT * FROM #DesiredOutput;
SELECT * FROM #DesiredOutput
EXCEPT
SELECT * FROM #tmpResults;
GO
EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate
---------: | :----------- | :---------- | :------- | :----- | --------------: | -----: | :------- | :--------- | :------ | :------
EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate
---------: | :----------- | :---------- | :------- | :----- | --------------: | -----: | :------- | :--------- | :------ | :------
db<>fiddle here
这正是@LukStorms 提供的,但格式更好,以便任何人都可以使用此代码。非常感谢您的支持。
SELECT
k.EmployeeId,k.PayGroupName,k.PayTypeName,k.SiteName,k.Region,k.PercentageScore,k.Center,k.[Function],k.Department,
MIN(k.EverySingleCalendarDate) AS MinDate,
MAX(k.EverySingleCalendarDate) AS MaxDate
FROM
(
SELECT
g.*,
SUM(g.Flag) OVER
(
PARTITION BY
g.EmployeeId,g.PayGroupName,g.PayTypeName,g.SiteName,g.Region,g.PercentageScore,g.Center,g.[Function],g.Department
ORDER BY g.EverySingleCalendarDate
) AS Rnk
FROM
(
SELECT
*,
Flag = CASE
WHEN DATEDIFF(dd,
LAG(EverySingleCalendarDate,1) OVER
(PARTITION BY
EmployeeId,PayGroupName,PayTypeName,SiteName,Region,PercentageScore,Center,[Function],Department
ORDER BY EverySingleCalendarDate),
EverySingleCalendarDate) = 1 THEN 0
ELSE 1
END
FROM
#SourceDataset
) g
) k
GROUP BY
k.EmployeeId,k.PayGroupName,k.PayTypeName,k.SiteName,k.Region,k.PercentageScore,k.Center,k.[Function],k.Department,
k.Rnk
--note the Rnk column in the GROUP BY
--ORDER BY k.EmployeeId, MinDate
我有 5 名员工 ID 值:111、222、333、444、555。
我有一个源数据集,其中包含 2021 年 3 月 28 日至 2021 年 4 月 5 日之间所有日历日的所有五个数据。(这只是我实际数据的一小部分样本)。
您可以使用这些脚本查看源数据示例:
CREATE TABLE #SourceDataset
(
EmployeeId int,
PayGroupName varchar(100),
PayTypeName varchar(100),
SiteName varchar(100),
Region varchar(100),
PercentageScore int,
Center int,
[Function] varchar(100),
Department varchar(100),
EverySingleCalendarDate date
)
--- for Employee ID = 111 ---
INSERT INTO #SourceDataset
VALUES (111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/28/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/29/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/30/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/31/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '4/1/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/2/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/2/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/3/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/3/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/4/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/4/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/5/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/5/2021')
--- for Employee ID = 111 ---
--- for Employee ID = 222 ---
INSERT INTO #SourceDataset
VALUES
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/28/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/29/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/30/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '3/31/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '4/1/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/2/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/2/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/4/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/5/2021')
--- for Employee ID = 222 ---
--- for Employee ID = 333 ---
INSERT INTO #SourceDataset
VALUES
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/28/2021'),
(333, 'Weekly PT', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/29/2021'),
(333, 'Weekly PT', 'Temporary', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/30/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/31/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '4/1/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/2/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/2/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/3/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/3/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/4/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/4/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/5/2021')
--- for Employee ID = 333 ---
--- for Employee ID = 444 ---
INSERT INTO #SourceDataset
VALUES
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/28/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/29/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/30/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/31/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '4/1/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/2/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/2/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 65, 29, 'RR', 'FG', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 35, 37, 'QQ', 'FG', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/5/2021')
--- for Employee ID = 444 ---
--- for Employee ID = 555 ---
INSERT INTO #SourceDataset
VALUES
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/28/2021'),
(555, 'WeeklyOptional', 'PT', 'StoreHouse2', 'RIC', 100, 19, 'WQ', 'FG', '3/29/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/30/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/31/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '4/1/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/2/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/3/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 23, 'BB', 'MA', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 24, 'CV', 'RU', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 34, 25, 'FJ', 'BN', '4/4/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/5/2021')
--- for Employee ID = 555 ---
SELECT *
FROM #SourceDataset
ORDER BY EmployeeId, EverySingleCalendarDate
---------------------------------------------------
目标:我正在尝试跟踪员工如何在一段时间内获得 100% 的百分比分数,并开发组来显示此信息,使用新的 MinDate 和 MaxDate 列,显示组存在的日期范围。在此处提到的时间段内(2021 年 3 月 28 日 - 2021 年 4 月 5 日),任何员工的日历天数都没有差距。
关于源数据集的注释:
一名员工在给定日历日的一行中可能会获得 100% 的百分比分数,在每一列(中心、职能、部门)下各有一个唯一值。或者,她可能会在另一个日历日获得 100% 的百分比分数,这 3 列的不同组合 - 中心、职能、部门 - 在多行中,以百分比拆分 分数(例如,三行中的 40 + 25 + 35(或)两行中的 50 + 50),这将在该日历日加起来为 100%。请参阅源数据集上的示例查询以了解我的意思。
源数据集的开发方式是 - 每个日历日必须占任何员工的 100%,并且日历日之间没有差距。对于员工,这 4 个列(PayGroupName、PayTypeName、SiteName、Region)的更改仅发生在日历日级别,而不是在 PercentageScore 列级别或 Center、Function、Department 列级别。
Example:
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 111
AND EverySingleCalendarDate = '2021-03-28'
--100 % Percentage Score in one row--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 111
AND EverySingleCalendarDate = '2021-04-02'
--100 % Percentage Score in two rows (50 + 50)--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 555
AND EverySingleCalendarDate = '2021-04-02'
--100 % Percentage Score in three rows (40 + 25 + 35)--
我的目标是跟踪每位员工在一段时间内如何获得 100% 的百分比分数 - 从 3 月 28 日到 4 月 5 日,所有这些天我所有 5 名员工的数据都可用,没有差距源数据集中的日历日。
员工在给定日历日的行数将取决于她如何获得 100% 的百分比分数,无论是在一行中 或多行。 'number of rows'(在任何员工的日历日)基本上取决于 3 列的集合 - 中心、职能、部门。
另一个要点:列 - PayGroupName、PayTypeName、SiteName、Region - 在给定的日历日对于员工始终具有一个唯一值。因此,给定日历上员工的行数不是由这些列决定的 - PayGroupName、PayTypeName、SiteName、Region。
也就是说,每个列(PayGroupName、PayTypeName、SiteName、Region)下的数据可能会在员工的日历日之间发生变化,我们也需要对此进行跟踪。请参阅下面源数据集的示例查询:
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 333
AND EverySingleCalendarDate BETWEEN '2021-03-28' AND '2021-03-30'
--PayGroupName and PayTypeName change between days for this employee (333)--
SELECT *
FROM #SourceDataset
WHERE EmployeeId = 555
AND EverySingleCalendarDate BETWEEN '2021-04-03' AND '2021-04-04'
/*
PayGroupName and SiteName change between days for this employee (555);
and its' very important to to note that for an employee, the change for these 4 columns
(PayGroupName, PayTypeName, SiteName, Region) can happen only at the calendar day level, NOT at the
level of Percentage Score or at the level of the columns - Center, Function, Department.
In essence, the change for these 4 columns (PayGroupName, PayTypeName, SiteName, Region) for an
employee can happen ONLY at the level of a calendar day.
*/
几周前,我在同一个
今天,我遇到了类似但具有挑战性的情况,在这种情况下,在给定的日历日,一名员工可能有多个行。这是基于员工(比如员工 ID = 111)如何获得 100% 百分比分数,对于一个日历日,比如 2021 年 3 月 28 日。
我有所需的输出数据集,作为使用 T-SQL 的临时 table 和表格输出,这样您就可以清楚地了解我遇到的问题手.
期望输出:
CREATE TABLE #DesiredOutput
(
EmployeeId int,
PayGroupName varchar(100),
PayTypeName varchar(100),
SiteName varchar(100),
Region varchar(100),
PercentageScore int,
Center int,
[Function] varchar(100),
Department varchar(100),
MinDate date,
MaxDate date
)
INSERT INTO #DesiredOutput
VALUES
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 100, 17, 'WQ', 'FG', '3/28/2021', '4/1/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 56, 'WQ', 'FG', '4/2/2021', '4/5/2021'),
(111, 'Biweekly', 'Salaried', 'Shop Floor', 'NYC', 50, 80, 'WQ', 'FG', '4/2/2021', '4/5/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '3/28/2021', '3/30/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 20, 'WR', 'FY', '3/31/2021', '4/1/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 25, 19, 'RH', 'FG', '4/2/2021', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 75, 19, 'DP', 'FG', '4/2/2021', '4/3/2021'),
(222, 'Monthly', 'PartTime', 'Office Room', 'POR', 100, 19, 'WQ', 'FG', '4/4/2021', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(333, 'Weekly PT', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/29/2021', '3/29/2021'),
(333, 'Weekly PT', 'Temporary', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/30/2021', '3/30/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 100, 19, 'WQ', 'FG', '3/31/2021', '4/1/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 40, 19, 'WQ', 'PQ', '4/2/2021', '4/5/2021'),
(333, 'Weekly', 'Contract', 'Store', 'ATL', 60, 19, 'WQ', 'AD', '4/2/2021', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(444, 'Weekly', 'FT-Optional', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/29/2021', '3/30/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 100, 19, 'WQ', 'FG', '3/31/2021', '4/1/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/2/2021', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/2/2021', '4/3/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 65, 29, 'RR', 'FG', '4/4/2021', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 35, 37, 'QQ', 'FG', '4/4/2021', '4/4/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 10, 'AB', 'FG', '4/5/2021', '4/5/2021'),
(444, 'Weekly', 'FT', 'StoreHouse', 'MIA', 50, 11, 'HP', 'FG', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/28/2021', '3/28/2021'),
(555, 'WeeklyOptional', 'PT', 'StoreHouse2', 'RIC', 100, 19, 'WQ', 'FG', '3/29/2021', '3/29/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 100, 19, 'WQ', 'FG', '3/30/2021', '4/1/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/2/2021', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/2/2021', '4/3/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/2/2021', '4/3/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 23, 'BB', 'MA', '4/4/2021', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 33, 24, 'CV', 'RU', '4/4/2021', '4/4/2021'),
(555, 'Weekly-NonOptional', 'FT', 'StoreHouse156', 'RIC', 34, 25, 'FJ', 'BN', '4/4/2021', '4/4/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 40, 23, 'BB', 'MA', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 25, 24, 'CV', 'RU', '4/5/2021', '4/5/2021'),
(555, 'Weekly', 'FT', 'StoreHouse1', 'RIC', 35, 25, 'FJ', 'BN', '4/5/2021', '4/5/2021')
SELECT *
FROM #DesiredOutput
ORDER BY EmployeeId, MinDate
我需要使用#SourceDataset 并将其转换为#DesiredOutput。
我需要一些建议。
例如,对于一名员工 (111) 和所有员工,#DesiredOutput(表格形式)如下所示:
EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate |
---|---|---|---|---|---|---|---|---|---|---|
111 | Biweekly | Salaried | Shop Floor | NYC | 100 | 17 | WQ | FG | 3/28/2021 | 4/1/2021 |
111 | Biweekly | Salaried | Shop Floor | NYC | 50 | 56 | WQ | FG | 4/2/2021 | 4/5/2021 |
111 | Biweekly | Salaried | Shop Floor | NYC | 50 | 80 | WQ | FG | 4/2/2021 | 4/5/2021 |
EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate |
---|---|---|---|---|---|---|---|---|---|---|
111 | Biweekly | Salaried | Shop Floor | NYC | 100 | 17 | WQ | FG | 3/28/2021 | 4/1/2021 |
111 | Biweekly | Salaried | Shop Floor | NYC | 50 | 56 | WQ | FG | 4/2/2021 | 4/5/2021 |
111 | Biweekly | Salaried | Shop Floor | NYC | 50 | 80 | WQ | FG | 4/2/2021 | 4/5/2021 |
222 | Monthly | PartTime | Office Room | POR | 100 | 19 | WQ | FG | 3/28/2021 | 3/30/2021 |
222 | Monthly | PartTime | Office Room | POR | 100 | 20 | WR | FY | 3/31/2021 | 4/1/2021 |
222 | Monthly | PartTime | Office Room | POR | 25 | 19 | RH | FG | 4/2/2021 | 4/3/2021 |
222 | Monthly | PartTime | Office Room | POR | 75 | 19 | DP | FG | 4/2/2021 | 4/3/2021 |
222 | Monthly | PartTime | Office Room | POR | 100 | 19 | WQ | FG | 4/4/2021 | 4/5/2021 |
333 | Weekly | Contract | Store | ATL | 100 | 19 | WQ | FG | 3/28/2021 | 3/28/2021 |
333 | WeeklyPT | Contract | Store | ATL | 100 | 19 | WQ | FG | 3/29/2021 | 3/29/2021 |
333 | WeeklyPT | Temporary | Store | ATL | 100 | 19 | WQ | FG | 3/30/2021 | 3/30/2021 |
333 | Weekly | Contract | Store | ATL | 100 | 19 | WQ | FG | 3/31/2021 | 4/1/2021 |
333 | Weekly | Contract | Store | ATL | 40 | 19 | WQ | PQ | 4/2/2021 | 4/5/2021 |
333 | Weekly | Contract | Store | ATL | 60 | 19 | WQ | AD | 4/2/2021 | 4/5/2021 |
444 | Weekly | FT | StoreHouse | MIA | 100 | 19 | WQ | FG | 3/28/2021 | 3/28/2021 |
444 | Weekly | FT-Optional | StoreHouse | MIA | 100 | 19 | WQ | FG | 3/29/2021 | 3/30/2021 |
444 | Weekly | FT | StoreHouse | MIA | 100 | 19 | WQ | FG | 3/31/2021 | 4/1/2021 |
444 | Weekly | FT | StoreHouse | MIA | 50 | 10 | AB | FG | 4/2/2021 | 4/3/2021 |
444 | Weekly | FT | StoreHouse | MIA | 50 | 11 | HP | FG | 4/2/2021 | 4/3/2021 |
444 | Weekly | FT | StoreHouse | MIA | 65 | 29 | RR | FG | 4/4/2021 | 4/4/2021 |
444 | Weekly | FT | StoreHouse | MIA | 35 | 37 | FG | 4/4/2021 | 4/4/2021 | |
444 | Weekly | FT | StoreHouse | MIA | 50 | 10 | AB | FG | 4/5/2021 | 4/5/2021 |
444 | Weekly | FT | StoreHouse | MIA | 50 | 11 | HP | FG | 4/5/2021 | 4/5/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 100 | 19 | WQ | FG | 3/28/2021 | 3/28/2021 |
555 | WeeklyOptional | PT | StoreHouse2 | RIC | 100 | 19 | WQ | FG | 3/29/2021 | 3/29/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 100 | 19 | WQ | FG | 3/30/2021 | 4/1/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 40 | 23 | BB | MA | 4/2/2021 | 4/3/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 25 | 24 | CV | RU | 4/2/2021 | 4/3/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 35 | 25 | FJ | BN | 4/2/2021 | 4/3/2021 |
555 | Weekly-NonOPTional | FT | StoreHouse156 | RIC | 33 | 23 | BB | MA | 4/4/2021 | 4/4/2021 |
555 | Weekly-NonOPTional | FT | StoreHouse156 | RIC | 33 | 24 | CV | RU | 4/4/2021 | 4/4/2021 |
555 | Weekly-NonOPTional | FT | StoreHouse156 | RIC | 34 | 25 | FJ | BN | 4/4/2021 | 4/4/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 40 | 23 | BB | MA | 4/5/2021 | 4/5/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 25 | 24 | CV | RU | 4/5/2021 | 4/5/2021 |
555 | Weekly | FT | StoreHouse1 | RIC | 35 | 25 | FJ | BN | 4/5/2021 | 4/5/2021 |
关于如何开发所需输出的任何想法?
下端的table数据是完整的table,可能难以翻阅;所以我在顶部有一个较小版本的 Employee ID = 111,然后是整个所需的输出。或者,您可以使用 T-SQL 脚本 了解#DesiredOutput 数据集。
使用的方法:
- 正在计算一个标志以指示间隔超过 1 天。
- 根据总和标志创建排名。
- 分组,包括计算出的排名。
SELECT EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department
, MIN(EverySingleCalendarDate) MinDate
, MAX(EverySingleCalendarDate) MaxDate
INTO #tmpResults
FROM (
SELECT *
, Rnk = SUM(Flag) OVER (PARTITION BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department ORDER BY EverySingleCalendarDate)
FROM
(
SELECT *
, Flag = IIF(1=DATEDIFF(day, LAG(EverySingleCalendarDate) OVER (PARTITION BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department ORDER BY EverySingleCalendarDate), EverySingleCalendarDate),0,1)
FROM #SourceDataset
) q1
) q2
GROUP BY EmployeeId, PayGroupName, PayTypeName, SiteName,
Region, PercentageScore,Center, [Function], Department, Rnk
ORDER BY EmployeeId, MinDate;
SELECT * FROM #tmpResults;
-- -- Differences -- SELECT * FROM #tmpResults EXCEPT SELECT * FROM #DesiredOutput; SELECT * FROM #DesiredOutput EXCEPT SELECT * FROM #tmpResults; GO
EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate ---------: | :----------- | :---------- | :------- | :----- | --------------: | -----: | :------- | :--------- | :------ | :------ EmployeeId | PayGroupName | PayTypeName | SiteName | Region | PercentageScore | Center | Function | Department | MinDate | MaxDate ---------: | :----------- | :---------- | :------- | :----- | --------------: | -----: | :------- | :--------- | :------ | :------
db<>fiddle here
这正是@LukStorms 提供的,但格式更好,以便任何人都可以使用此代码。非常感谢您的支持。
SELECT
k.EmployeeId,k.PayGroupName,k.PayTypeName,k.SiteName,k.Region,k.PercentageScore,k.Center,k.[Function],k.Department,
MIN(k.EverySingleCalendarDate) AS MinDate,
MAX(k.EverySingleCalendarDate) AS MaxDate
FROM
(
SELECT
g.*,
SUM(g.Flag) OVER
(
PARTITION BY
g.EmployeeId,g.PayGroupName,g.PayTypeName,g.SiteName,g.Region,g.PercentageScore,g.Center,g.[Function],g.Department
ORDER BY g.EverySingleCalendarDate
) AS Rnk
FROM
(
SELECT
*,
Flag = CASE
WHEN DATEDIFF(dd,
LAG(EverySingleCalendarDate,1) OVER
(PARTITION BY
EmployeeId,PayGroupName,PayTypeName,SiteName,Region,PercentageScore,Center,[Function],Department
ORDER BY EverySingleCalendarDate),
EverySingleCalendarDate) = 1 THEN 0
ELSE 1
END
FROM
#SourceDataset
) g
) k
GROUP BY
k.EmployeeId,k.PayGroupName,k.PayTypeName,k.SiteName,k.Region,k.PercentageScore,k.Center,k.[Function],k.Department,
k.Rnk
--note the Rnk column in the GROUP BY
--ORDER BY k.EmployeeId, MinDate