【问题标题】:SQL Sort By a Column and group by another column simultaneouslySQL 按列排序并同时按另一列分组
【发布时间】:2014-06-17 04:56:39
【问题描述】:

原始表:作业

| Amount |  Name |
        3    Raj
        1    Nish
        15   Nish
        10   Nish
        8    Krish
        22   Rahul
        5    Raj
        50   Raj

要求的结果格式

 | Amount |  Name |
        50    Raj
         5    Raj
         3    Raj
        22    Rahul
        15    Nish
        10    Nish
         1    Nish
         8    Krish

我应用的逻辑是对金额列进行排序并获得最大金额,即 (50) 并获得 该人(Raj)的另一笔交易并继续搜索第二个最大项目,不包括已选择的人员详细信息(不包括 Raj)。

请帮帮我

我尝试先按“Amt”然后按“name”排序,但不会产生预期的结果

【问题讨论】:

  • 哪个 dbms ? sql server 还是 mysql ?
  • 按名称 DESC、数量 DESC 排序
  • @Mihai 如果 Krish 有最大数量,这将不起作用..
  • @mhasan 为什么,你能深入一点吗?不按名字先排序,这样无论数量多少,Krish 都会排在最后?
  • @Mihai 是的,你是对的,但这不是作者想要的。如果 Krish 的名字是 'Andre',它在结果中的位置应该是一样的。

标签: sql sorting group-by sql-order-by


【解决方案1】:

此语句将给出每个名称的最大数量。

select name, max(amount) as max_amt
from jobs
group by name
order by max_amt desc;

Raj    50
Nish   25
Rahul  22
Krish   8

对max_amt desc 进行排序以正确的顺序为我们提供了组。现在我们需要做的就是将它加入到“jobs”表中,并按两个数字列对结果进行排序。

我使用 CTE 来简化一些事情。

with max_amounts as (
  select name, max(amount) as max_amt
  from jobs
  group by name
)
select t1.*, t2.max_amt from jobs t1
inner join max_amounts t2 
        on t2.name = t1.name
order by max_amt desc, amount desc;

在标准 SQL 中,我认为您可以从外部 SELECT 子句中删除 max_amt,并且仍然使用 order by max_amt desc。

【讨论】:

  • 如果你有更多的列,那么你就会明白,这是行不通的!
【解决方案2】:
create table SORT_AMT_NAME(AMOUNT INT,NAME VARCHAR(20))


INSERT INTO SORT_AMT_NAME Values (22,'Rahul')
INSERT INTO SORT_AMT_NAME Values (8,'Krish')
INSERT INTO SORT_AMT_NAME Values (15,'Nish')
INSERT INTO SORT_AMT_NAME Values (1,'Nish')
INSERT INTO SORT_AMT_NAME Values (10,'Nish')
INSERT INTO SORT_AMT_NAME Values (50,'Raj')
INSERT INTO SORT_AMT_NAME Values (3,'Raj')
INSERT INTO SORT_AMT_NAME Values (5,'Raj')
INSERT INTO SORT_AMT_NAME Values (25,'GS')




SELECT AMOUNT,SORT_AMT_NAME.NAME FROM SORT_AMT_NAME,
(
select MAX(AMOUNT) AS MAX_AMT,NAME,ROW_NUMBER() over (order by MAX(AMOUNT) desc) as Amount_Order
from SORT_AMT_NAME
GROUP BY NAME) x
WHERE X.NAME=SORT_AMT_NAME.nAME
ORDER BY Amount_Order ASC ,AMOUNT DESC,SORT_AMT_NAME.NAME

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2021-12-15
    • 2022-01-11
    • 2018-10-23
    • 2011-07-04
    相关资源
    最近更新 更多