所以我有一個更不像這個名字的表tests_summary:
| test_id | 完全的 | 其余的 | score_date |
|---|---|---|---|
| 200 | 6 | 1 | 2022-05-02 |
| 200 | 2 | 7 | 2022-05-01 |
| 200 | 5 | 10 | 2022-04-29 |
| 200 | 5 | 15 | 2022-04-28 |
| 199 | 10 | 0 | 2022-05-02 |
| 199 | 2 | 10 | 2022-05-01 |
首先,我嘗試按每個 test_id 分組,每個測驗完成的 SUM,但我想在剩余的列中獲取最近得分日期中的剩余值。示例 test_id 200,最近的日期是 2022-05-02,剩下的 1 就是我想要的值。在這個表中已經訂購了,但在我的真實表中沒有。
預期結果
| test_id | 完全的 | 其余的 |
|---|---|---|
| 200 | 18 | 1 |
| 199 | 12 | 0 |
版本 5.7.12
uj5u.com熱心網友回復:
您可以使用行號功能為您關心的每個專案給您一個 1。
請注意,我在這里使用 * 作為速記,但您應該只在最終代碼中選擇您感興趣的列。
SELECT *
FROM (
SELECT z.*, ROW_NUMBER(PARTITION BY test_id ORDER BY score_date DESC) AS RN
FROM sometableyoudidnotname z
) X
WHERE X.RN = 1
uj5u.com熱心網友回復:
您可以使用
SELECT test_id, completed, remaining
FROM (SELECT test_id,
remaining,
SUM(completed) OVER(PARTITION BY test_id) AS completed,
ROW_NUMBER() OVER(PARTITION BY test_id ORDER BY score_date DESC) AS rn
FROM t) tt
WHERE rn = 1
如果您的資料庫及其版本適合使用視窗(或分析)函式,您可以在其中通過按score_datewhile 磁區降序排序來獲取最新日期,以便按每個分組test_id
uj5u.com熱心網友回復:
更新。該解決方案僅適用于 PostgreSQL。感謝霍根糾正我
我不確定我的解決方案是否是性能最佳的解決方案,但它仍然有效。主要思想是在“剩余”列上使用DISTINCT ON構造,并用子查詢單獨匯總“完成”列:
WITH
t AS (SELECT 200 AS test_id,
0 AS completed,
1 AS remaining,
'2022-05-02'::DATE AS score_date
UNION
SELECT 200,
2,
3,
'2022-05-01'
UNION
SELECT 199,
10,
0,
'2022-05-02'
UNION
SELECT 199,
2,
10,
'2022-05-01')
SELECT
distinct on (t1.test_id)
t1.remaining,
t1.test_id,
(select sum(completed) from t where t.test_id = t1.test_id)
FROM t t1
ORDER BY t1.test_id,t1.score_date desc;
輸出結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474927.html
上一篇:用Join替換mysql變數
下一篇:熊貓資料框的最佳條件連接
