Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对现有sql查询的更好解决方案_Sql - Fatal编程技术网

针对现有sql查询的更好解决方案

针对现有sql查询的更好解决方案,sql,Sql,我有这样的桌子: type | date | id ----------------------------- 1 | 2012-01-01 | 1 2 | 2012-01-01 | 2 1 | 2012-02-02 | 3 2 | 2012-02-02 | 4 我需要构建一个查询,该查询将拾取类型的所有“最新”不同值(在本例中,它将是id为3和4的记录)。现在我有了这个解决方案: select *

我有这样的桌子:

type       | date       | id
-----------------------------
1          | 2012-01-01 | 1
2          | 2012-01-01 | 2
1          | 2012-02-02 | 3
2          | 2012-02-02 | 4
我需要构建一个查询,该查询将拾取类型的所有“最新”不同值(在本例中,它将是id为3和4的记录)。现在我有了这个解决方案:

select * from test t1 where date = 
(select max(date) from test t2 where t2.type = t1.type ) order by type, date desc

nested select的出现让我很尴尬,也许还有更优雅的解决方案?

既然您没有提到您正在使用的RDBMS,那么试试这个。将在大多数RDBMS上工作

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  type, MAX(DATE) maxDAte
            FROM tableName
            GROUP BY type
        ) b ON a.type = b.type AND
                a.DATE = b.maxDate
或者如果您的RDBMS支持
窗口功能

SELECT type, date, id
FROM
(
    SELECT type, date, id,
            ROW_NUMBER() OVER (PARTITION BY type
                                ORDER BY date DESC) rn
    FROM tableNAme
) s
WHERE rn = 1

在您的特定示例中,这也可以起作用:

select type, max(date), max(id)
from your_table
group by type

但请注意,只有当您绝对确定日期和ID总是在增加时,它才会起作用。如果不是这种情况,
max(date)
max(id)
可能位于两个不同的行上。只有当你知道你在做什么时才使用这个!如果不是,则嵌套查询没有问题。

哪种RDBMS?例如,对于MySQL来说,这是完美的(imho)。在其他方言中也有其他选择。你真正想问的可能是。。。给定类型的最新日期活动是什么——从而导致返回ID为3和4的记录?您知道,子选择并不是一件坏事?不必感到尴尬;)2DRAP,否,每种类型的最新日期活动+1:这只是同一算法的代数重新安排。然而,应注意的是,一些RDBMS比OPs建议更好地优化了这一点。(我从来都不知道这比老年退休金计划的建议更糟糕。)[我也会+1
ROW_NUMBER()。