使用 row_number() 获取一组记录中的中间行
Use row_number() to take middle row in a set of records
之前我打开了一个问题,询问如何在一组记录中取第一行,这些记录得到了很好的解决。遗憾的是,我的客户稍后更改了他的请求,所以这次我请求您帮助找到一组记录中的中间行,即:
TemperatureID
CastingID
TemperatureDateTime
TemperatureValue
1421294
1073513
2021-01-07 11:53:00.000
1648
1421295
1073513
2021-01-07 11:54:00.000
1698
1421296
1073513
2021-01-07 11:57:00.000
1699
我必须取 1421295 记录,而中间 + 1 或中间 - 1 是偶数
所以从这个查询开始,return1421294条记录要清楚
SELECT *
FROM (
SELECT
CastingID, TemperatureValue, TemperatureDateTime
, ROW_NUMBER() OVER (PARTITION BY CastingID ORDER BY CastingID) RN
FROM Production.Temperatures
where YEAR(TemperatureDateTime) = 2021 and PhaseID = 250
) A
WHERE RN = 1 and year(A.TemperatureDateTime) = 2021
我能得到我想要的结果还是我必须改变我的方法?
编辑:更新为使用 cte。
Edit2:更新为使用连接而不是 sub-select 来处理多个 castingIds
既然ROW_NUMBER()
要给我们一组连续的值,为什么不找MAX(RN)
除以2再取整呢?如果 MAX(RN)
是奇数,您将得到真正的中位数,如果它是偶数,您将被四舍五入。可能有一种更简洁的方法来执行此操作,但像这样:
WITH cte AS (
SELECT
temperatureID
,castingID
,temperatureValue
,ROW_NUMBER() OVER (PARTITION BY castingID ORDER BY TemperatureDateTime) AS RN
FROM Temperatures
)
SELECT
*
FROM cte AS c
INNER JOIN (
SELECT
castingID
,CEILING(CONVERT(DECIMAL(7,2),MAX(RN)) / 2) AS med
FROM cte
GROUP BY castingID
) AS m ON c.rn = m.med AND c.castingID = m.castingID
这是一个 SQL Fiddle 查询结果:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=5b3aebf3ab4ced946c90a435d9edce3c
共有三个用例(都具有不同的 castingID
)。
1.) 奇数行
2.) 偶数行
3.) 一行
之前我打开了一个问题,询问如何在一组记录中取第一行,这些记录得到了很好的解决。遗憾的是,我的客户稍后更改了他的请求,所以这次我请求您帮助找到一组记录中的中间行,即:
TemperatureID | CastingID | TemperatureDateTime | TemperatureValue |
---|---|---|---|
1421294 | 1073513 | 2021-01-07 11:53:00.000 | 1648 |
1421295 | 1073513 | 2021-01-07 11:54:00.000 | 1698 |
1421296 | 1073513 | 2021-01-07 11:57:00.000 | 1699 |
我必须取 1421295 记录,而中间 + 1 或中间 - 1 是偶数
所以从这个查询开始,return1421294条记录要清楚
SELECT *
FROM (
SELECT
CastingID, TemperatureValue, TemperatureDateTime
, ROW_NUMBER() OVER (PARTITION BY CastingID ORDER BY CastingID) RN
FROM Production.Temperatures
where YEAR(TemperatureDateTime) = 2021 and PhaseID = 250
) A
WHERE RN = 1 and year(A.TemperatureDateTime) = 2021
我能得到我想要的结果还是我必须改变我的方法?
编辑:更新为使用 cte。 Edit2:更新为使用连接而不是 sub-select 来处理多个 castingIds
既然ROW_NUMBER()
要给我们一组连续的值,为什么不找MAX(RN)
除以2再取整呢?如果 MAX(RN)
是奇数,您将得到真正的中位数,如果它是偶数,您将被四舍五入。可能有一种更简洁的方法来执行此操作,但像这样:
WITH cte AS (
SELECT
temperatureID
,castingID
,temperatureValue
,ROW_NUMBER() OVER (PARTITION BY castingID ORDER BY TemperatureDateTime) AS RN
FROM Temperatures
)
SELECT
*
FROM cte AS c
INNER JOIN (
SELECT
castingID
,CEILING(CONVERT(DECIMAL(7,2),MAX(RN)) / 2) AS med
FROM cte
GROUP BY castingID
) AS m ON c.rn = m.med AND c.castingID = m.castingID
这是一个 SQL Fiddle 查询结果: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=5b3aebf3ab4ced946c90a435d9edce3c
共有三个用例(都具有不同的 castingID
)。
1.) 奇数行
2.) 偶数行
3.) 一行