假设我有一个包含三列的 PET 表:名称、类型和日期。我想按日期对三列进行排序,但只显示特定类型的最新一列(本例中为“狗”),其余的全部显示。例如,我的原始数据列表:
Name Type Date
Nemo Fish June 1, 2016
Fido Dog January 1, 2016
Felix Dog February 1, 2016
Whiskers Cat April 1, 2016
Marlin Fish August 1, 2016
Shifu Cat March 3, 2016
应用查询时看起来像这样。
Felix Dog February 1, 2016
Shifu Cat March 3, 2016
Whiskers Cat April 1, 2016
Nemo Fish June 1, 2016
Marlin Fish August 1, 2016
我敢肯定有多种方法可以做到这一点,但从效率的角度来看,只有几种方法是最佳的。
解决方案 1
使用特定于 PostgreSQL 的 DISTINCT ON 子句,我们可以在单个表扫描中执行此操作:
方案二
使用更多与 ANSI 兼容的 SQL,例如UNION和 LIMIT。它可以在 MySQL、DB2 和其他一些平台上运行。类似的解决方案可以在 Oracle 上完成,只需将 LIMIT 替换为 ROWNUM。
性能说明
对于小表(少于 1000000 行),任何解决方案都适用。
DISTINCT ON
稍微快一点:对于“大数据”,确保您的查询只进行一次索引表扫描。
作为对@filiprems 解决方案的补充,这里有一个使用条件窗口函数的解决方案:
我不指望它在任何方面都变得更好,它只是展示了另一种做事方式。