过滤结果集以确定最小值

Filtering result set to determine minimum values

我有三个 table,这样连接

[PLAYLIST].DBI_ID =1:1= [SUB_FILES].SBF_PLY_ID =*:1= [STL].DBI_ID

从这个数据库中,我可以获取一些数据:

SELECT 
  PLAYLIST.dbi_id as PLY_ID,
  SUB_FILES.dbi_id as SBF_ID,
  SUB_FILES.dbi_created_time as SBF_CREATED,
  STL.dbi_id as STL_ID
FROM PLAYLIST, SUB_FILES, STL
WHERE (PLAYLIST.ply_automation_id = 'F0117705' 
      OR PLAYLIST.ply_automation_id = 'F0117707')
  AND (SUB_FILES.sbf_ply_id = PLAYLIST.dbi_id)
  AND (SUB_FILES.sbf_stl_id = STL.dbi_id)

PLAYLIST.ply_automation_id = ...条件仅用于测试。最后,我将 运行 查询整个 PLAYLIST table。

我不知道如何为每个不同的 STL_ID 值只获取具有最小 SBF_CREATED 日期的记录。

换句话说,我只想取回 PLY_ID 的 14.604(具有 STL_ID = 5.596 的两条记录中最小的 SBF_CREATED)和 14.747 的数据(它具有所有四个记录中最小的 SBF_CREATED STL_ID = 5.642)。

有问题的数据库是 Firebird 2.1,但如果可能的话,我对通用 SQL 答案感兴趣。

根据您的描述,我认为您实际想要的结果是:

PLY_ID  SBF_ID  SBF_CREATED             STL_ID
14.604  16044   2008-11-28 15:46:00.000 5.596
14.747  16.210  2008-12-11 11:30:00.000 5.642

因为那些是最低的SBF_CREATED

您可以做的是在您加入的派生 table 中找到每个 sbf_stl_id 的最低日期:

SELECT 
  PLAYLIST.dbi_id as PLY_ID,
  SUB_FILES.dbi_id as SBF_ID,
  SUB_FILES.dbi_created_time as SBF_CREATED,
  STL.dbi_id as STL_ID
FROM PLAYLIST
JOIN SUB_FILES ON SUB_FILES.sbf_ply_id = PLAYLIST.dbi_id
JOIN STL ON SUB_FILES.sbf_stl_id = STL.dbi_id
JOIN 
(
    SELECT sbf_stl_id, MIN(dbi_created_time) AS min_dbi_created_time 
    FROM SUB_FILES 
    GROUP BY sbf_stl_id
) AS sub ON sub.sbf_stl_id = stl.dbi_id 
        AND sub.min_dbi_created_time = SUB_FILES.dbi_created_time
WHERE (PLAYLIST.ply_automation_id = 'F0117705' OR PLAYLIST.ply_automation_id = 'F0117707')

当我使用 SQL 服务器进行测试时,这给出了预期的结果,但由于它不使用任何特殊的产品特定功能,而是仅使用标准 SQL,因此它应该适用于任何符合标准的数据库.