如何在内部查询中排序?

时间:2019-07-19 17:49:39

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

我有一个这样的表:

MY_TABLE

Id   Name  Brand   Date 
--   ----  -----   ------
1    ABC    1      18-09-2019
2    XYZ    1      19-09-2019
3    MNO    1      18-09-2019
4    ABC    1      19-09-2019
5    PQR    2      17-06-2020
6    MNO    1      19-03-2019
7    ABC    2      19-09-2019

我想以这样的方式编写查询:首先我需要基于Date进行排序。根据该结果,我必须将count(Name)排序为brand。像这样

ID    Name   Count(Name)   Brand   date
---   ----   ----------   ------   -----
1      ABC      2            1      19-09-2019
2      XYZ      1            1      19-09-2019  // Eventhough count is less it came second because 19-09-2019 is latest than 19-03-2019
3      MNO      2            1      18-09-2019  

5 个答案:

答案 0 :(得分:4)

您可以group by name进行汇总:

select
  name,
  count(*) counter,
  max(brand) brand,
  max(trunc(datee)) maxdate
from my_table
where brand = 1
group by name
order by maxdate desc, counter desc

我使用trunc(datee)是因为您的日期(我们发现)包含时间部分。
请参见demo
结果:

> NAME | COUNTER | BRAND | MAXDATE  
> :--- | ------: | ----: | :--------
> ABC  |       2 |     1 | 19-SEP-19
> XYZ  |       1 |     1 | 19-SEP-19
> MNO  |       2 |     1 | 18-SEP-19

答案 1 :(得分:1)

您必须首先使用group by创建计数,然后使用支持多个字段(逗号分隔)的顺序进行排序。一旦为计数赋予列别名,就可以按以下顺序使用该别名:

select name, brand, min(date), count(name) as NumRecords, min(id) as id
from my_table
group by name, brand
order by date, NumRecords

我添加了min(id),因为您似乎想显示最小id。

答案 2 :(得分:0)

我认为您想基于最近日期的最高计数来为每个名称/品牌对选择一行:

select t.*
from (select t.*,
             row_number() over (partition by name, brand order by date desc, count desc) as seqnum
      from t
     ) t
where seqnum = 1;

答案 3 :(得分:0)

这是您想要的吗?

  SELECT MIN(ID),  Name,   
   Count(Name),   Brand,  MIN(date) as 
    Date_MIN
   From Table where Brand =1 Group by 
   Brand,Name 
   Order by Date_MIN desc,Count(Name) 
   Desc;
  ;

答案 4 :(得分:0)

从my_table中选择名称,COUNT(*)个BrandCount,MAX(brand)个品牌 ORDER BY日期

您可以使用[ASC |最后根据需要。 类似于query

希望它能排序