簡體   English   中英

如何基於兩個字段的最大值作為第三個字段的子集的 select 記錄?

[英]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_idbookie_idp1字段(不管是哪一個)。 所以從上面我會得到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"

你覺得這對嗎?

SQL

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

演示

DB 小提琴演示

您可以使用ROW_NUMBER() window function 兩次。
首先使用它來獲取每個match_op_idbookie_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM