Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -----------+-------+
- | name | value |
- -----------+-------+
- | John | 20 |
- | John | 7 |
- | John | 7 |
- -----------+-------+
- WITH cte AS
- ( SELECT name, value,
- ROW_NUMBER() OVER (PARTITION BY name
- ORDER BY value DESC
- )
- AS rn
- FROM t
- )
- SELECT name, value, rn
- FROM cte
- WHERE rn <= 3
- ORDER BY name, rn ;
- SELECT name, value, rn
- FROM
- ( SELECT name, value,
- ROW_NUMBER() OVER (PARTITION BY name
- ORDER BY value DESC
- )
- AS rn
- FROM t
- ) tmp
- WHERE rn <= 3
- ORDER BY name, rn ;
- SELECT t.tid, t.name, t.value, -- self join and GROUP BY
- COUNT(*) AS rn
- FROM t
- JOIN t AS t2
- ON t2.name = t.name
- AND ( t2.value > t.value
- OR t2.value = t.value
- AND t2.tid <= t.tid
- )
- GROUP BY t.tid, t.name, t.value
- HAVING COUNT(*) <= 3
- ORDER BY name, rn ;
- SELECT t.tid, t.name, t.value, rn
- FROM
- ( SELECT t.tid, t.name, t.value,
- ( SELECT COUNT(*) -- inline, correlated subquery
- FROM t AS t2
- WHERE t2.name = t.name
- AND ( t2.value > t.value
- OR t2.value = t.value
- AND t2.tid <= t.tid
- )
- ) AS rn
- FROM t
- ) AS t
- WHERE rn <= 3
- ORDER BY name, rn ;
- select distinct t.personid, val, rank
- from (select t.*,
- (select COUNT(distinct val) from t t2 where t2.personid = t.personid and t2.val >= t.val
- ) as rank
- from t
- ) t
- where rank in (1, 2, 3)
- with t as (
- select 1 as personid, 5 as val union all
- select 1 as personid, 6 as val union all
- select 1 as personid, 6 as val union all
- select 1 as personid, 7 as val union all
- select 1 as personid, 8 as val
- )
- select distinct t.personid, val, rank
- from (select t.*,
- (select COUNT(distinct val) from t t2 where t2.personid = t.personid and t2.val >= t.val
- ) as rank
- from t
- ) t
- where rank in (1, 2, 3);
- SELECT *
- FROM tbl t
- WHERE FIND_IN_SET(t.value,(SELECT
- SUBSTRING_INDEX(GROUP_CONCAT(t1.value ORDER BY VALUE DESC),',',3)
- FROM tbl t1
- WHERE t1.name = t.name
- GROUP BY t1.name)) > 0
- ORDER BY t.name,t.value desc
- CREATE TABLE #list ([name] [varchar](100) NOT NULL, [value] [int] NOT NULL)
- INSERT INTO #list VALUES ('John', 20), ('John', 7), ('John', 7), ('John', 7), ('John', 4);
- WITH cte
- AS (
- SELECT NAME
- ,value
- ,ROW_NUMBER() OVER (
- PARTITION BY NAME ORDER BY (value) DESC
- ) RN
- FROM #list
- )
- SELECT NAME
- ,value
- FROM cte
- WHERE RN < 4
- ORDER BY value DESC
- if object_id('tempdb..#Data') is not null drop table #Data;
- GO
- create table #data (name varchar(25), value integer);
- GO
- set nocount on;
- insert into #data values ('John', 20);
- insert into #data values ('John', 7);
- insert into #data values ('John', 7);
- insert into #data values ('John', 7);
- insert into #data values ('John', 5);
- insert into #data values ('Jack', 5);
- insert into #data values ('Jane', 30);
- insert into #data values ('Jane', 21);
- insert into #data values ('John', 5);
- insert into #data values ('John', -1);
- insert into #data values ('John', -1);
- insert into #data values ('Jane', 18);
- set nocount off;
- GO
- with D as (
- SELECT
- name
- ,Value
- ,row_number() over (partition by name order by value desc) rn
- From
- #Data
- )
- SELECT Name, Value
- FROM D
- WHERE RN <= 3
- order by Name, Value Desc
- Name Value
- Jack 5
- Jane 30
- Jane 21
- Jane 18
- John 20
- John 7
- John 7
Add Comment
Please, Sign In to add comment