[英]How to select records based on max value of two fields as a subset of third field?
給定以下簡單表格:
+-----+-------------+-----------+---------+----+
| id_ | match_op_id | bookie_id | version | p1 |
+-----+-------------+-----------+---------+----+
| 1 | 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 1 | 5 |
| 3 | 1 | 1 | 2 | 3 |
| 4 | 1 | 2 | 2 | 4 |
| 5 | 2 | 1 | 1 | 5 |
| 6 | 2 | 2 | 1 | 3 |
| 7 | 2 | 2 | 2 | 4 |
+-----+-------------+-----------+---------+----+
我想構建一個查詢,為每個match_op_id
從每個bookie_id
的最大version
和最大p1
中選擇單個記錄的match_op_id
、 bookie_id
和p1
字段(不管是哪一個)。 所以從上面我會得到output:
+-------------+-----------+----+
| match_op_id | bookie_id | p1 |
+-------------+-----------+----+
| 1 | 2 | 4 |
| 2 | 1 | 5 |
+-------------+-----------+----+
從另一個問題的答案,我得到了:
SELECT o1.match_op_id, o1.bookie_id, MAX(o1.p1) p1
FROM odds_op o1
WHERE o1.version = (SELECT MAX(o2.version) FROM odds_op o2 WHERE o2.match_op_id = o1.match_op_id)
GROUP BY o1.match_op_id
但是,我不知道如何通過bookie_id
實現最大version
。 任何幫助將不勝感激。
為了澄清評論中提出的問題......對於每個match_op_id
我正在尋找查詢以查找bookie_id
的最高version
,然后返回最高的p1
。 所以在上面的match_op_id
"2" 的例子中, bookie_id
"1" 的最大version
是 "1", p1
是 "5"。 bookie_id
"2" 的最大version
是 "2", p1
是 "4"。 因此,查詢應該返回bookie_id
“1”, p1
為“5”。
SELECT DISTINCT match_op_id, bookie_id, max_version, max_p1
FROM (
SELECT distinct st1.match_op_id match_op_id, st2.bookie_id, st2.max_version, st3.max_p1
FROM SIMPLE_table st1
JOIN ( -- version
SELECT match_op_id, bookie_id, MAX(`version`) max_version FROM simple_table GROUP BY match_op_id, bookie_id) st2
ON st1.match_op_id = st2.match_op_id
JOIN ( -- p1
SELECT match_op_id, bookie_id, `version`, MAX(p1) max_p1 FROM simple_table GROUP BY match_op_id, bookie_id, `version`) st3
ON st2.max_version=st3.`version` AND st2.bookie_id=st3.bookie_id AND st1.match_op_id=st3.match_op_id) all_
GROUP BY max_version HAVING MAX(max_p1)
這使:
"match_op_id" "bookie_id" "max_version" "max_p1"
"2" "1" "1" "5"
"1" "2" "2" "4"
你覺得這對嗎?
WITH max_versions AS
(SELECT match_op_id, bookie_id, MAX(version) AS version
FROM tbl
GROUP BY match_op_id, bookie_id),
mv_full AS
(SELECT t.match_op_id, t.bookie_id, t.p1
FROM max_versions mv
JOIN tbl t
ON mv.match_op_id = t.match_op_id
AND mv.bookie_id = t.bookie_id
AND mv.version = t.version),
max_p1s AS
(SELECT match_op_id, MAX(p1) AS p1
FROM mv_full
GROUP BY match_op_id)
SELECT mf.*
FROM mv_full mf
JOIN max_p1s mp
ON mp.match_op_id = mf.match_op_id
AND mp.p1 = mf.p1
您可以使用ROW_NUMBER()
window function 兩次。
首先使用它來獲取每個match_op_id
和bookie_id
組合的最大version
的行,然后對於返回的行,使用它來獲取每個match_op_id
最大p1
的行:
SELECT match_op_id, bookie_id, p1
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY match_op_id ORDER BY p1 DESC) rn2
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY match_op_id, bookie_id ORDER BY version DESC) rn1
FROM odds_op
) t
WHERE rn1 = 1
) t
WHERE rn2 = 1
或使用ROW_NUMBER()
和FIRST_VALUE
:
SELECT DISTINCT match_op_id,
FIRST_VALUE(bookie_id) OVER (PARTITION BY match_op_id ORDER BY p1 DESC) bookie_id,
MAX(p1) OVER (PARTITION BY match_op_id) p1
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY match_op_id, bookie_id ORDER BY version DESC) rn
FROM odds_op
) t
WHERE rn = 1
請參閱演示。
結果:
match_op_id bookie_id p1 1 2 4 2 1 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.