对于另一行的每个不同值,如何从 table 中获取具有最大值(所有相等行)的行?
How can I get rows from a table with the max value (all equal rows) for each different value of another row?
在我正在开发的 Android 应用程序中,我需要根据 2 行(因此成对)获取有关 table 的信息,但无法真正找到实现它的方法.我怎么能用 SQL 实现呢?
/!\ 以下是一个简化的示例,因为实际情况会更令人困惑而不是帮助。 /!\
例如,如果我有这个 table:
我怎样才能得到这个结果(每个类别的最佳分数行):
我以前是这样做的:
SELECT name, category, MAX(score)
FROM SCORE_TABLE
GROUP BY category
但我会得到这个:
当我检查答案时,我看到了使用子查询的解决方案,如下所示:
SELECT *
FROM SCORE_TABLE
WHERE score == (
SELECT MAX(score)
FROM SCORE_TABLE
)
但这只适用于一个类别,所以我想也许我可以使用带有所有 category-max_score 对的 table 的一些变体,像这样:
MAX_SCORE_TABLE:
但我真的不知道怎么做,所以如果你有任何想法,我希望得到一些帮助^^
我相信你需要的是NTILE(num)函数。它根据分区将您的数据分成桶。您在每个类别中排名前 2 的数据将在每个类别中排名第 1。
SELECT name, category, score, NTILE(2) OVER (
PARTITION BY category
ORDER BY score DESC
) scoreplacement
FROM SCORE_TABLE
where NTILE(2) OVER (
PARTITION BY category
ORDER BY score DESC
) = 1
GROUP BY category
我还没有通过创建 table 来尝试过,但这应该会有所帮助。由于 From
在 select
之前计算,我们不能引用别名列名。
我认为这应该可行,但请检查更大的数据集:
SELECT name,
category,
score
FROM score_table AS tab1
RIGHT JOIN
(SELECT category AS cat,
MAX(score) AS max
FROM score_table
GROUP BY cat) AS tab2
ON tab1.score = max AND category = cat;
在我正在开发的 Android 应用程序中,我需要根据 2 行(因此成对)获取有关 table 的信息,但无法真正找到实现它的方法.我怎么能用 SQL 实现呢?
/!\ 以下是一个简化的示例,因为实际情况会更令人困惑而不是帮助。 /!\
例如,如果我有这个 table:
我怎样才能得到这个结果(每个类别的最佳分数行):
我以前是这样做的:
SELECT name, category, MAX(score)
FROM SCORE_TABLE
GROUP BY category
但我会得到这个:
当我检查答案时,我看到了使用子查询的解决方案,如下所示:
SELECT *
FROM SCORE_TABLE
WHERE score == (
SELECT MAX(score)
FROM SCORE_TABLE
)
但这只适用于一个类别,所以我想也许我可以使用带有所有 category-max_score 对的 table 的一些变体,像这样:
MAX_SCORE_TABLE:
但我真的不知道怎么做,所以如果你有任何想法,我希望得到一些帮助^^
我相信你需要的是NTILE(num)函数。它根据分区将您的数据分成桶。您在每个类别中排名前 2 的数据将在每个类别中排名第 1。
SELECT name, category, score, NTILE(2) OVER (
PARTITION BY category
ORDER BY score DESC
) scoreplacement
FROM SCORE_TABLE
where NTILE(2) OVER (
PARTITION BY category
ORDER BY score DESC
) = 1
GROUP BY category
我还没有通过创建 table 来尝试过,但这应该会有所帮助。由于 From
在 select
之前计算,我们不能引用别名列名。
我认为这应该可行,但请检查更大的数据集:
SELECT name,
category,
score
FROM score_table AS tab1
RIGHT JOIN
(SELECT category AS cat,
MAX(score) AS max
FROM score_table
GROUP BY cat) AS tab2
ON tab1.score = max AND category = cat;