繁体   English   中英

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

[英]SQL select one row from max(date)

我一直在尝试获取一些具体信息,但无法获取。

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.597costPrice:11.50 (因为它与MAX(createDt)在同一行),因为它们具有相同的idStyleidStyleDtlidCustomer 我以为可能是MAX(costPrice) ,但它只是返回了更高的costPrice而不是与MAX(createDt)在同一行中的MAX(createDt)

当有相同的idStyleidStyleDtlidCustomer时,我想获得一整行具有MAX(createDt)结果。

即使是小的建议也将不胜感激。 谢谢!

您可以尝试将ROW_NUMBER窗口函数配合使用,以在子查询中按idStyleidStyleDtlidCustomer列创建行号, idStyle 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, created_dt)上的索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM