过滤结果集以确定最小值
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,因此它应该适用于任何符合标准的数据库.
我有三个 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,因此它应该适用于任何符合标准的数据库.