2017-07-27 53 views
1
SELECT id, author_id, max(result_score) as maxscore 
FROM submissions 
WHERE challenge_id = 10 
GROUP BY author_id 
ORDER BY maxscore DESC, created_at ASC 

此查詢從具有最高分數並且最早創建的每個作者獲取提交(一個)。最後,我們最終應該提交有序的提交作品,每個作者一個,所有作者都按照maxscore和created_at排序。SQL - 從每個表中選擇最大值,按所述最大值排序,然後通過created_at

這在SQLite3中完美運行,但它在PostgreSQL上編譯失敗,因爲它更嚴格。 PostgreSQL要求id要麼通過group by子句使用,要麼使用某種聚合函數。

我嘗試了各種方法,使用DISTINCT ONHAVING,但無法使其工作。這種查詢是否可行?如果是,那麼在這裏實現我想要的方式的方法是什麼?

回答

2

它只能在SQLite中「完美」工作,因爲SQLite已損壞。也就是說,它幾乎在任何其他數據庫中都會失敗,因爲它不是正確的SQL。

在Postgres裏,你可以做你想做的使用DISTINCT ON

SELECT DISTINCT ON (author_id) id, author_id, result_score 
FROM submissions 
WHERE challenge_id = 10 
ORDER BY author_id, result_score DESC, created_at ASC; 

編輯:

如果您想通過result_score排序的最終結果,那麼你可以使用子查詢:

SELECT s.* 
FROM (SELECT DISTINCT ON (author_id) id, author_id, result_score 
     FROM submissions 
     WHERE challenge_id = 10 
     ORDER BY author_id, result_score DESC, created_at ASC 
    ) s 
ORDER BY result_score DESC, created_at ASC; 
+0

這是真的,這工作,但不保留我原來的查詢中的邏輯。 這不會對它們進行正確排序,我們可以在結果中包含#1行,它沒有最大'result_score'和最小'created_at',而是最大'author_id' – Nether

+0

@Nether。 。 。它所做的就是*完全*問題中所描述的內容:「該查詢從具有最高分數並且最早創建的每個作者獲得提交。」 –

+0

對不起,我不清楚 – Nether

2

我設法解決這個使用rank這樣的功能

SELECT id, author_id, result_score 
FROM (
    SELECT id, author_id, result_score, created_at, 
      rank() OVER (PARTITION BY author_id ORDER BY result_score DESC, created_at ASC) AS rank 
    FROM submission 
    WHERE challenge_id = %s) as sub 
WHERE sub.rank = 1 
ORDER BY result_score DESC, created_at ASC 
+0

'DISTINCT ON'是一個更好的解決方案,更短更快 - 除非你需要你的代碼是ANSI兼容的(原始代碼不是)。 –

+0

@GordonLinoff'DISTINCT ON'什麼?它要求你在'ORDER BY'語句中有相同的參數,這對我不起作用 – Nether