我的解決方案假定有可能在TABLE_SUB
任意數量的行。我假設,如果您指定的中間行,那你的意思是,行由EXT_POINT
排序,如果這不是你需要什麼,你將不得不修改PARTITION
語句的ORDER BY
子句中的RowOrderPerPkt CTE
。
如果有奇數行然後它需要每PKT
中間行。
如果有偶數行則取中間兩排每PKT
並把他們的平均值。
所以在這裏,它是:
SQL Fiddle
MS SQL Server 2008的架構設置:
CREATE TABLE TABLE_MAIN (PKT INT,EXT DECIMAL(10,3))
INSERT INTO TABLE_MAIN (PKT,EXT)
VALUES (1101,0.508), (1102,1.998), (1103,0.423)
CREATE TABLE TABLE_SUB (PKT INT,EXT DECIMAL(10,3))
INSERT INTO TABLE_SUB (PKT,EXT)
VALUES (1101,0.504), (1101,0.505), (1101,0.510)
,(1102,1.990), (1102,1.995), (1102,2.005)
,(1103,0.504), (1103,0.505), (1103,0.510), (1103,1.990)
查詢1:
;WITH RowOrderPerPkt
AS
(
SELECT PKT, EXT, ROW_NUMBER() OVER (PARTITION BY PKT ORDER BY EXT) AS RN
FROM TABLE_SUB
),
NumRowsPerPkt
AS
(
SELECT PKT, COUNT(*) AS MaxRows
FROM TABLE_SUB
GROUP BY PKT
)
-- TABLE_SUB with an odd number of rows per PKT
-- Simply take the middle row
-- i.e. MaxRows/2 + 1
SELECT T1.PKT, T1.EXT, ROPP.EXT
FROM TABLE_MAIN T1
INNER JOIN RowOrderPerPkt ROPP
ON ROPP.PKT = T1.PKT
INNER JOIN NumRowsPerPkt NRPP
ON NRPP.PKT = ROPP.PKT
WHERE NRPP.MaxRows % 2 = 1 AND
ROPP.RN = NRPP.MaxRows/2 + 1
UNION
-- TABLE_SUB with an even number of rows per PKT
-- Simply take the middle 2 rows and find the average
-- i.e. get the rows MaxRows/2 and MaxRows/2 + 1
SELECT T1.PKT, T1.EXT, AVG(ROPP.EXT)
FROM TABLE_MAIN T1
INNER JOIN RowOrderPerPkt ROPP
ON ROPP.PKT = T1.PKT
INNER JOIN NumRowsPerPkt NRPP
ON NRPP.PKT = ROPP.PKT
WHERE NRPP.MaxRows % 2 = 0
AND (ROPP.RN = NRPP.MaxRows/2 OR ROPP.RN = NRPP.MaxRows /2 + 1)
GROUP BY T1.PKT, T1.Ext
Results:
| PKT | EXT | EXT |
|------|-------|--------|
| 1101 | 0.508 | 0.505 |
| 1102 | 1.998 | 1.995 |
| 1103 | 0.423 | 0.5075 |
你嘗試過什麼了嗎? – Mike
你需要3箇中間的一個(並且總是有3個?)或者你是否需要與EXT_POINT最接近的值? – CeOnSql
如果table_sub中沒有3行具有相同的pkt_no,那麼預期會得到什麼結果? – jarlh