【问题标题】:Filtering result set to determine minimum values过滤结果集以确定最小值
【发布时间】:2015-04-28 12:18:27
【问题描述】:

我有三个表,这样连接

[播放列表].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 表运行查询。

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

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

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

【问题讨论】:

  • 什么版本的火鸟?
  • 2.1,但如果可能的话,我对通用 SQL 答案感兴趣

标签: sql select firebird greatest-n-per-group


【解决方案1】:

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

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 最低的那些。

您可以做的是在您加入的派生表中找到每个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 Server 进行测试时,这给出了预期的结果,但由于它不使用任何特殊的产品特定功能,而只是使用标准 SQL,因此它应该适用于任何符合标准的数据库。

【讨论】:

  • 感谢更正,我已经更正了问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多