我试图删除不必要的时间,因为我只需要min()max()数据,从选定的id.并通过堆栈溢出读取相同的问题:

但很多命令都使用SELECT.因为按id删除除min()和max()以外的数据.

以下是我的疑问:

DELETE FROM table1
WHERE ID_karyawan IN (1, 3, 4, 5, 6, 7) -- List all the IDs you want to filter here
  AND jam NOT IN (SELECT MIN(jam) 
                  FROM table1 
                  WHERE ID_karyawan IN (1, 3, 4, 5, 6, 7) -- Repeat the list of IDs here
                  UNION
                  SELECT MAX(jam) 
                  FROM table1 
                  WHERE ID_karyawan IN (1, 3, 4, 5, 6, 7) -- Repeat the list of IDs here
                 );

SELECT 
    table1.ID_karyawan, table1.nama_karyawan, 
    table1.jam, table1.tanggal, table1.arah
FROM 
    table1 
GROUP BY 
    ID_karyawan, nama_karyawan, jam, tanggal, arah

这是我的表(表1):

ID karyawan nama karyawan   jam          tanggal    arah
-------------------------------------------------------------
1   ridho azhar megantara   07:44:45    2023-07-20  masuk
1   ridho azhar megantara   17:04:46    2023-07-20  keluar
3   Hendy Arief Yuwono  17:24:47    2023-07-20  keluar
3   Hendy Arief Yuwono  06:58:41    2023-07-20  masuk
3   Hendy Arief Yuwono  17:24:41    2023-07-20  keluar
4   Ety wulandari           07:51:48    2023-07-20  masuk
4   Ety wulandari           17:04:07    2023-07-20  keluar
5   Joseph Tan          17:03:48    2023-07-20  keluar
5   Joseph Tan          07:40:31    2023-07-20  masuk
6   Herry Joko Susilo   17:04:16    2023-07-20  keluar
6   Herry Joko Susilo   07:26:11    2023-07-20  masuk
6   Herry Joko Susilo   07:26:16    2023-07-20  masuk
7   Martha Ayu Wulandari    07:49:53    2023-07-20  masuk
7   Martha Ayu Wulandari    07:50:23    2023-07-20  masuk
7   Martha Ayu Wulandari    17:04:43    2023-07-20  keluar

进入这一阶段:

ID karyawan nama karyawan   jam          tanggal    arah
-----------------------------------------------------------
1   ridho azhar megantara   07:44:45    2023-07-20  masuk
1   ridho azhar megantara   17:04:46    2023-07-20  keluar
3   Hendy Arief Yuwono  06:58:41    2023-07-20  masuk
3   Hendy Arief Yuwono  17:24:41    2023-07-20  keluar
4   Ety wulandari           07:51:48    2023-07-20  masuk
4   Ety wulandari           17:04:07    2023-07-20  keluar
5   Joseph Tan          17:03:48    2023-07-20  keluar
5   Joseph Tan          07:40:31    2023-07-20  masuk
6   Herry Joko Susilo   07:26:11    2023-07-20  masuk
6   Herry Joko Susilo   17:04:16    2023-07-20  keluar
7   Martha Ayu Wulandari    07:49:53    2023-07-20  masuk
7   Martha Ayu Wulandari    17:04:43    2023-07-20  keluar

但是,如果执行多于1的查询,则所有选定的id将被永久删除.

就像这样:

3   Hendy Arief Yuwono  06:58:41    2023-07-20 00:00:00.000
3   Hendy Arief Yuwono  17:24:47    2023-07-20 00:00:00.000
8   Aries Krisnawan         07:49:06    2023-07-20 00:00:00.000
8   Aries Krisnawan         07:49:11    2023-07-20 00:00:00.000
8   Aries Krisnawan         17:04:30    2023-07-20 00:00:00.000

所以所有选定的id都消失了.我的查询是不是错了?或者你对此有什么建议?

推荐答案

您可以首先在CTE中 Select 每个ID的最小日期和最大日期,然后删除所有其他行.这就是基本的 idea :

WITH dates AS
(SELECT 
  id, MIN(yourdate) AS minDate, 
  MAX(yourdate) AS maxDate
 FROM table1
 GROUP BY id)
DELETE FROM table1
  WHERE 
    NOT EXISTS 
      (SELECT 1 FROM dates d 
        WHERE table1.id = d.id 
          AND table1.yourdate IN (d.minDate, d.maxDate));

下面是一个fiddle个示例,它显示了该命令在多次执行时不会意外地删除任何其他行.

我不清楚你是否需要添加更多的条件,GROUP BY或其他任何条件.如果需要,您应该能够理解这个 idea ,并对您的用例进行必要的更改.

最后,但也是重要的一点:在我的回答中,我 Select 了最小和最大日期,而不是时间.这不是错误,但我认为将日期和时间保存在单独的列中是一个非常糟糕的主意.我不知道您是否真的这样做了,或者您只是错误地设置了样本数据的格式. 始终使用一个单独的列,并在那里存储整个日期和时间.这使得确定最早或最晚日期(时间)变得容易得多,例如这里需要的日期(时间).

Sql相关问答推荐

如何更改函数返回的列名?

出现5次后,将所有正斜杠替换为连字符

Oracle SQL-将结果列在单行中

Oracle SQL根据列中的条件 Select 最大记录数

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

Pgsql-返回包含多行数据的行

IF NOT EXISTS子查询的性能瓶颈

在PostgreSQL中汇总连接表中的 case 值

表函数的作用域和功能

Postgres jsonpath运算符的变量替换,如_regex?

使用CTE在SNOWFLAKE中创建临时表

Clickhouse:左连接表到外部数组

什么是 100.它与 100 有什么区别?

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

使用给定的变量对在循环中执行更新语句

Select 字段,除非另一个字段包含重复项

查找具有相同连接列数据的所有记录

来自 SQL Server 的树层次 struct 图的 JSON

包含多行的 SQL 查询