【发布时间】:2026-01-03 07:15:01
【问题描述】:
我有一个数据库,其中包含可以分配给组(另一个表)的员工(一个表)。 Bother 与另一个表employee-to-group 连接在一起,其中列出了组ID、员工ID 和分配的开始日期。
始终必须将员工分配到一个组,但分配可能每天都在变化。一名员工可能在 A 组工作一天,然后一周后转到 B 组并在 C 组工作。
我的任务是找出在任何给定日期哪些员工被分配到由其名称给出的某个组。所以输入应该是:组名、日期,我希望输出是在给定时刻属于该组的所有员工的数据。
这是一个包含一些测试数据的 SQL 小提琴: http://sqlfiddle.com/#!9/6d0bb
我用 mysql-statements 重新创建了数据库,因为我无法弄清楚 oracle 语句,对不起。
从测试数据中可以看出,有些员工可能永远不会更换组,而另一些则经常更换。还有一些员工计划在未来改变工作。查询必须考虑到这一点。
由于该应用程序是旧版应用程序,因此值(尤其是日期字段中的值)是有问题的。它们以“自 1990 年 1 月 1 日以来的天数”给出,因此条目“9131”表示“2015 年 1 月 1 日”。 9468 是今天 (2015-12-04),9496 是 2016-01-01)。
我已经拥有的是用于找出任何给定日期的“日期值”的代码,我称之为我正在使用的应用程序的“旧格式”(这里我刚刚使用了 CURRENT_DATE):
SELECT FLOOR(CURRENT_DATE - TO_DATE('1990-01-01', 'YYYY-MM-DD')) AS diffdate
为了找出某个员工被分配到哪个组,我尝试了:
SELECT * FROM history h
WHERE emp_nr = 1 AND valid_from <= 9131
ORDER BY valid_from DESC
FETCH FIRST ROW ONLY;
应该返回给我员工在 2015 年 1 月 1 日分配到的组。
我需要帮助的是创建一个连接所有表的语句对整个组而不是仅对一个员工执行相同的操作(因为数据库中有数千名员工,我只想要最多 10 个组的数据)。
我很感谢任何指向正确方向的指针。
【问题讨论】:
-
至于“我只想要最多10组的数据”:你会如何决定哪些组?仅通过
where group.nr in (10,20,30,...)或您要应用的某种算法? -
是的,我将只使用 WHERE 子句过滤掉我需要从中获取数据的组。
标签: sql oracle greatest-n-per-group