簡體   English   中英

從 SQL 中其他列的表基的每個部分中選擇最小和最大列值

[英]select min and max column value from each part of table base of other column in SQL

我有一個表格,顯示每個員工出現在一個辦公室時。 示例 SQL 表 EmpPTable 名稱是這樣的:

ID 員工ID 日期P 時間P
1 11111 1397/01/02 01:30
2 11111 1398/05/09 05:30
3 11111 1398/06/07 05:10
4 22222 1398/08/09 06:12
5 22222 1399/02/01 07:15
6 11111 1399/07/02 08:51
7 11111 1399/08/06 12:20
8 33333 1399/09/04 20:01
9 33333 1399/12/08 22:05
10 33333 1400/01/01 23:11
11 33333 1400/02/05 14:10
12 22222 1400/04/05 16:25

我想為每個在辦公室的員工准確選擇最小和最大日期:

ID 員工ID 最小日期 最大日期P
1 11111 1397/01/02 1398/06/07
2 22222 1398/08/09 1399/02/01
3 11111 1399/07/02 1399/08/06
4 33333 1399/09/04 1400/02/05
5 22222 1400/04/05 1400/04/05

我給出最大值的 SQL 代碼是:

       SELECT EmployeeID,MinDateP
        FROM (
          SELECT EmployeeID
          FROM EmpPTable
          GROUP BY EmployeeID
        ) As rstOuter
        OUTER APPLY (
          SELECT TOP 1 DateP As MinDateP
          FROM EmpPTable As rstInner
          WHERE rstInner.EmployeeID = rstOuter.EmployeeID
          ORDER BY DateP
        ) AS rstMinPoints

給出最小日期員工的 SQL 代碼是:

        SELECT EmployeeID,MaxDateP
        FROM (
          SELECT EmployeeID
          FROM EmpPTable
          GROUP BY EmployeeID
        ) As rstOuter
        OUTER APPLY (
          SELECT TOP 1 DateP As MaxDateP
          FROM EmpPTable As rstInner
          WHERE rstInner.EmployeeID = rstOuter.EmployeeID
          ORDER BY DateP desc
        ) AS rstMinPoints

但是上面的代碼為所有表中的每個員工提供了最小和最大日期列。

你應該group by列建立一個group by

mysql5.8

with tab1 as (
select 1 id, 1 user_id, '2021-11-01' dat from dual union all
select 2 id, 1 user_id, '2021-11-02' dat from dual union all
select 3 id, 1 user_id, '2021-11-03' dat from dual union all
select 4 id, 2 user_id, '2021-11-04' dat from dual union all
select 5 id, 2 user_id, '2021-11-05' dat from dual union all
select 6 id, 1 user_id, '2021-11-06' dat from dual union all
select 7 id, 1 user_id, '2021-11-07' dat from dual union all
select 8 id, 1 user_id, '2021-11-08' dat from dual union all
select 9 id, 3 user_id, '2021-11-09' dat from dual 
)
, tab2 as (
select t1.*,
       case when lag(t1.user_id) over(order by t1.id) is null then 1
            when lag(t1.user_id) over(order by t1.id) = t1.user_id then 0
            else 1
       end lg
  from tab1 t1
)
, tab3 as (
select t1.*,
       sum(t1.lg) over(order by t1.id) grp
  from tab2 t1
)
select t1.user_id,
       min(t1.dat),
       max(t1.dat)
  from tab3 t1
 group by t1.user_id, t1.grp

我無法復制您的代碼,因為缺少一些字段(serial1?)。 但這是我的解決方案。

CREATE TABLE #tempEmployee (
    ID INT,
    EmployeeID INT,
    EmpDate DATE,
    EmpTime TIME
);

INSERT INTO #tempEmployee VALUES (1, '11111', '2021-01-10', '12:30');
INSERT INTO #tempEmployee VALUES (1, '11111', '2021-12-10', '12:33');
INSERT INTO #tempEmployee VALUES (1, '11111', '2021-11-10', '12:30');
INSERT INTO #tempEmployee VALUES (2, '22222', '2021-01-11', '12:30');
INSERT INTO #tempEmployee VALUES (2, '22222', '2021-11-11', '12:30');

SELECT * FROM #tempEmployee;

WITH MaxDate AS (SELECT EmployeeID, MAX(EmpDate) AS MaxEmpDate FROM #tempEmployee GROUP BY EmployeeID),
     MinDate AS (SELECT EmployeeID, MIN(EmpDate) AS MinEmpDate FROM #tempEmployee GROUP BY EmployeeID)

     SELECT n.EmployeeID,
            n.MinEmpDate,
            x.MaxEmpDate
        FROM MinDate n 
        INNER JOIN MaxDate x ON n.EmployeeID = x.EmployeeID
        ORDER BY n.EmployeeID;

DROP TABLE #tempEmployee;

輸出....

EmployeeID  MinEmpDate  MaxEmpDate
11111       2021-01-10  2021-12-10
22222       2021-01-11  2021-11-11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM