簡體   English   中英

一列分組記錄

[英]Group record by one column

我正在使用SQL Server2012。我有這樣的表:

Val1 Val2      Val3 Val4
-------------------------------------------
1   25000.00    1   1900-01-01 00:00:00.000
2   25000.00    1   2012-04-02 00:00:00.000
1   25125.00    1   2013-01-01 00:00:00.000
1   25502.00    1   2014-01-01 00:00:00.000
2   25502.00    1   2014-04-01 00:00:00.000
3   25502.00    1   2015-01-01 00:00:00.000
4   25502.00    1   2015-04-01 00:00:00.000
1   62500.00    2   1900-01-01 00:00:00.000
2   62500.00    2   2012-06-29 00:00:00.000
1   63750.00    2   2013-01-01 00:00:00.000
1   65025.00    2   2014-01-01 00:00:00.000
1   69250.00    2   2015-01-01 00:00:00.000
1   4300.00 3   1900-01-01 00:00:00.000
2   4300.00 3   2012-05-01 00:00:00.000
1   4343.00 3   2013-01-01 00:00:00.000
2   4343.00 3   2013-06-01 00:00:00.000
3   4343.00 3   2013-09-01 00:00:00.000
4   4343.00 3   2014-04-01 00:00:00.000
5   4343.00 3   2014-09-01 00:00:00.000
1   3257.25 3   2014-09-15 00:00:00.000
2   3257.25 3   2015-03-01 00:00:00.000
1   4543.00 3   2015-04-01 00:00:00.000

我想得到這樣的東西:

 Val1 Val2      Val3 Val4
 ----------------------------------------------
    2   25000.00    1   2012-04-02 00:00:00.000
    1   25125.00    1   2013-01-01 00:00:00.000
    4   25502.00    1   2015-04-01 00:00:00.000
    2   62500.00    2   2012-06-29 00:00:00.000
    1   63750.00    2   2013-01-01 00:00:00.000
    1   65025.00    2   2014-01-01 00:00:00.000
    1   69250.00    2   2015-01-01 00:00:00.000
    2   4300.00 3   2012-05-01 00:00:00.000
    5   4343.00 3   2014-09-01 00:00:00.000
    2   3257.25 3   2015-03-01 00:00:00.000
    1   4543.00 3   2015-04-01 00:00:00.000

我試過這個SQL查詢:

select 
    t1.* 
from 
    table1 t1 
inner join 
    (select 
         Val3,  max(Val1) as MaxRank
     from 
         table1 
     group by 
         Val3) t13 on t1.Val3 = t13.Val3 and t1.Val1 = t13.MaxRank 
order by 
    t1.Val3

但我只有Val3一個記錄。

應該這樣做(這在mysql中,但是相同的原理適用於任何sql數據庫):

use example;

drop table if exists table1;

create table table1(
    Val1 varchar(100),
    Val2 varchar(100),
    Val3 varchar(100)
);

insert into table1 values('1', '100.00', '1');
insert into table1 values('2', '100.00', '2');
insert into table1 values('2', '200.00', '2');
insert into table1 values('3', '100.00', '2');
insert into table1 values('3', '200.00', '2');
insert into table1 values('3', '300.00', '2');
insert into table1 values('4', '100.00', '4');
insert into table1 values('4', '200.00', '4');
insert into table1 values('4', '300.00', '4');
insert into table1 values('4', '300.00', '4');


select
    val1,
    max(val2)
from
    table1
group by val1
order by val1
;


+ --------- + -------------- +
| val1      | max(val2)      |
+ --------- + -------------- +
| 1         | 100.00         |
| 2         | 200.00         |
| 3         | 300.00         |
| 4         | 300.00         |
+ --------- + -------------- +
4 rows

也許這可以幫助您:

select t1.* 
from table1 t1
    join (
           select max(Val1) as Val1, Val2, Val3 
           from table1 
           group by Val2, Val3
         ) t2 on t1.Val1=t2.Val1 and t1.Val2 = t2.Val2 and t1.Val3=t2.Val3

這應該工作

SELECT
    val1,
    val2,
    val3,
    val4
FROM
    (SELECT *,
            ROW_NUMBER () OVER (PARTITION BY val2 ORDER BY val1 DESC) rn 
     FROM  table1 
    ) a
WHERE
    rn = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM