azure 每个用户的SQL TOP 20结果,在第1列中使用其最高值,如果是多个相同的值,则根据第2列的最高值进行选择

wixjitnu  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(98)

在过去的几天里,我一直在玩这个,似乎在绕圈子,所以我想在我秃顶之前寻求帮助。
我已经设法收到了基于第1列中的最大值的前20个条目,但没有考虑Stat 1中的重复项,其中Stat 2更高等。因此,如果用户有两个具有相同Stat 1的条目,则返回两者。
数据如下所示:
| Stat1| Stat2| Stat3| Stat3 |
| --|--|--| ------------ |
| 二十六|十八个|四个| 4 |
| 二十个|二十六|八个| 8 |
| 二十六|十九岁|九个| 9 |
| 三十|五个|一个| 1 |
| 二十六|十八个|六个| 6 |
| 十二个|八个|二个| 2 |
预期结果:
| Stat1| Stat2| Stat3| Stat3 |
| --|--|--| ------------ |
| 三十|五个|一个| 1 |
| 二十六|十九岁|九个| 9 |
| 二十六|十八个|六个| 6 |
| 二十六|十八个|四个| 4 |
这是我最新的查询,它返回了上面提到的重复项,没有考虑Stat 2列。

SELECT
    TOP 20
    t1.UID,
    isnull(t1.Stat1, 0) AS Stat1,
    isnull(t1.Stat2, 0) AS Stat2,
    isnull(t1.Stat3, 0) AS Stat3
FROM
    TABLE t1
WHERE
    t1.Stat1 = (
        SELECT
            MAX(t2.Stat1)
        FROM
            TABLE t2
        WHERE
            t2.UID = t1.UID
    )
ORDER BY
    Stat1 DESC,
    Stat2 DESC,
    Stat3 DESC

字符串
我还尝试返回所有值。在PHP中循环手动删除重复的内容。(这个方法很有效)我只是不喜欢这个方法,因为我觉得它很浪费。

jmo0nnb3

jmo0nnb31#

我建议使用row_number()来确定“rows per uid”,并使用select distinct从结果中删除重复项。例如:

select distinct
    UID, Stat1, Stat2, Stat3    
from (
  select
      *
      , row_number() over(partition by uid order by stat1 DESC, stat2 DESC) as rn
  from mytable
  ) as d
where rn < 4 --<< increase this number to suit how many "per uid"
order by
     UID, Stat1 DESC, Stat2 DESC, Stat3

字符串
| Stat1| Stat2| Stat3|注解| notes |
| --|--|--|--| ------------ |
| 一百一十六|十八个|四个|||
| 一一二○|二十六|八个|||
| 一百二十六|十八个|四个|||
| 一百一十六|十九岁|九个|||
| 一百二十六|十九岁|九个|||
| 二十六|十九岁|九个|||
| 1130|五个|一个|||
| 一一一二|八个|二个|||
| 一百三十|五个|一个|||
| 二十六|十八个|六个|<<表中有3个重复的数据行| << there are 3 duplicate rows of this data in the table |
fiddle

相关问题