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函数,这将变得更加复杂。