我有下表:
-----------------------------------------
xDate xItem xCount
-----------------------------------------
2018-01-01 A 100
2018-01-01 B 200
2018-01-01 D 500
2018-01-02 C 200
2018-01-02 E 800我希望在xCount字段的最大值上为每个日期选择顶部2值。因此,结果应该是:
-----------------------------------------
xDate xItem xCount
-----------------------------------------
2018-01-01 D 500
2018-01-01 B 200
2018-01-02 E 800
2018-01-02 C 200有人对这个案子有什么想法吗?
干杯,
发布于 2018-12-26 07:37:47
您可以尝试使用RANK窗口函数,如果有更多的行具有相同的xCount,那么您希望获得它们的全部。
您可以尝试使用dense_rank而不是RANK
SELECT xDate,xItem,xCount
FROM (
SELECT *,RANK() OVER(PARTITION BY xDate ORDER BY xCount DESC) rn
FROM T
) t1
WHERE t1.rn <= 2发布于 2018-12-26 07:32:53
您可以使用ROW_NUMBER()并在xDate和OrderbyxCount的基础上对其进行分区,以获得所需的东西。
select X.xDate,
X.xItem,
X.xCount
from
(select xDate,
xItem,
xCount,
row_number() over (partition by xDate order by xCount desc) rank_of_count
from table_name) X
where rank_of_count < 3发布于 2018-12-26 07:42:42
我不会使用任何功能。在我看来挺直接的。最快的是
SELECT * FROM #temp s
WHERE ( SELECT COUNT(*) FROM #temp f WHERE f.xDate = s.xDate AND f.xCount >= s.xCount ) <= 2
Order by xDate, xCount desc在这里查看完整的示例代码:
create table #temp (xDate datetime, xItem nvarchar(max), xCount int);
insert into #temp
select
'2018-01-01','A', 100 union all
select '2018-01-01','B', 200 union all
select '2018-01-01','D', 500 union all
select '2018-01-02','C', 200 union all
select '2018-01-02','E', 800
SELECT * FROM #temp s
WHERE ( SELECT COUNT(*) FROM #temp f WHERE f.xDate = s.xDate AND f.xCount >= s.xCount ) <= 2
Order by xDate, xCount desc
drop table #temp;https://stackoverflow.com/questions/53928806
复制相似问题