SQL从max(日期)中选择一行

SQL从max(日期)中选择一行,sql,sql-server,database,Sql,Sql Server,Database,我一直在试图得到一些具体的,但无法得到它 SELECT idStyle, idStyleDtl, costPrice, MAX(createDt) created, idCustomer FROM INVOICE_DTL GROUP BY idStyle, idStyleDtl,costPrice, idCustomer ORDER BY idStyle, idCustomer 这是我的疑问和建议 这就是结果。 我所期望的

我一直在试图得到一些具体的,但无法得到它

SELECT 
    idStyle, 
    idStyleDtl, 
    costPrice, 
    MAX(createDt) created, 
    idCustomer 
FROM INVOICE_DTL
GROUP BY 
    idStyle, idStyleDtl,costPrice, idCustomer
ORDER BY 
    idStyle, idCustomer
这是我的疑问和建议

这就是结果。 我所期望的是,高亮显示的部分将被合并,并且只显示一行created:2017-02-01 12:38:31.597和costPrice:11.50,因为它与MAXcreateDt是同一行,因为它们具有相同的idStyle、idStyleDtl和idCustomer。我认为MAXcostPrice可能就是它,但它只是返回了更高的costPrice,而不是与MAXcreateDt位于同一行的那个

当存在相同的idStyle、idStyleDtl和idCustomer时,我希望得到一整行具有MAXcreateDtresult

即使是很小的建议也会很感激。谢谢

您可以尝试在子查询中使用带有窗口功能的ROW_NUMBER,按idStyle、idStyleDtl、idCustomer列和按createDt DESC排序生成行号

然后得到rn=1数据,这意味着最大日期

SELECT * FROM (
    SELECT 
        idStyle, 
        idStyleDtl, 
        costPrice, 
        createDt, 
        idCustomer,
        ROW_NUMBER() OVER(PARTITION BY idStyle, idStyleDtl, idCustomer ORDER BY createDt DESC) rn
    FROM INVOICE_DTL
) t1
where rn = 1
ORDER BY 
    idStyle, idCustomer
您可以尝试使用带有窗口功能的ROW_NUMBER,在子查询中按idStyle、idStyleDtl、idCustomer列和createDt DESC顺序生成行号

然后得到rn=1数据,这意味着最大日期

SELECT * FROM (
    SELECT 
        idStyle, 
        idStyleDtl, 
        costPrice, 
        createDt, 
        idCustomer,
        ROW_NUMBER() OVER(PARTITION BY idStyle, idStyleDtl, idCustomer ORDER BY createDt DESC) rn
    FROM INVOICE_DTL
) t1
where rn = 1
ORDER BY 
    idStyle, idCustomer

通常,最有效的方法是相关子查询:

select i.* 
from invoice_dtl i
where i.created_dt = (select max(i2.created_dt)
                      from invoice_dtl i2
                      where i2.idCustomer = i.idCustomer and 
                            i2.idStyle = i.idStyle and
                            i2.idStyleDtl = i.idStyleDtl
                     )
order by i.idStyle, i.idCustomer;

特别是,这可以利用idCustomer、idStyle、idStyleDtl上创建的索引。

通常,最有效的方法是相关子查询:

select i.* 
from invoice_dtl i
where i.created_dt = (select max(i2.created_dt)
                      from invoice_dtl i2
                      where i2.idCustomer = i.idCustomer and 
                            i2.idStyle = i.idStyle and
                            i2.idStyleDtl = i.idStyleDtl
                     )
order by i.idStyle, i.idCustomer;

特别是,这可以利用idCustomer、idStyle、idStyleDtl上创建的索引。

Brilliant!我永远也不会想到这个。。出于好奇,是否可以使用GROUP BY获得相同的结果?@MinLee是的,您可以在子查询中使用它,如SELECT*FROM INVOICE\u DTL t1(存在)从INVOICE\u DTL tt中选择1,其中t1.idStyle=tt.idStyleDtl=tt.idStyleDtl和t1.idCustomer=tt.idCustomer GROUP BY tt.idStyle,tt.idStyleDtl,tt.idCustomer拥有MAXtt.createDt=t1.createDt t1按idStyle、idCustomer排序,正如您从group BY example中看到的,虽然它在您的特定示例中起作用,但行号版本的优点是您可以按多列排序。如果没有行数函数,这将变得更加复杂。太棒了!我永远也不会想到这个。。出于好奇,是否可以使用GROUP BY获得相同的结果?@MinLee是的,您可以在子查询中使用它,如SELECT*FROM INVOICE\u DTL t1(存在)从INVOICE\u DTL tt中选择1,其中t1.idStyle=tt.idStyleDtl=tt.idStyleDtl和t1.idCustomer=tt.idCustomer GROUP BY tt.idStyle,tt.idStyleDtl,tt.idCustomer拥有MAXtt.createDt=t1.createDt t1按idStyle、idCustomer排序,正如您从group BY example中看到的,虽然它在您的特定示例中起作用,但行号版本的优点是您可以按多列排序。如果没有row_number函数,这将变得更加复杂。