它有点难以解释。跳到示例可能会更容易。
一个表有一个ID和四列,每列允许为空。
ID, Col1, Col2, Col3, Col4
有x行数。(通常小于4)并且在整个列中最多只能使用4个不同的值。
我希望返回最多4行,其中结果集中的每一行基本上都是一列值,其中该值是从顶部保留Col编号开始从右向左选择的。如果另一行的值不是列唯一,则将其移至下一个可用列。
例子:
如果我有:
ID, Col1, Col2, Col3, Col4
0, A , B , , C
1, , , D ,
我想回来
A
B
D
C
和
ID, Col1, Col2, Col3, Col4
0, A , B , D ,
1, C , , ,
给
A
B
D
C
和
ID, Col1, Col2, Col3, Col4
0, A , B , D ,
1, C , , ,
2, C , , ,
给
A
B
D
C
谢谢!当存在非唯一列并且值之间存在空格时,可以排除这种情况。
这不会发生:
a,b,,d
c,,,
这可能会有所帮助:
CREATE TABLE #original ( id int ,A INT, B INT, C INT, D INT );
INSERT INTO #original
--SELECT 0,1,2,null,4
--union
--select 1,null,null,3,null
--
--
--SELECT 0,1,2,3,null
--union
--select 1,4,null,null,null
--
--
SELECT 0,1,2,4,null
union
select 1,3,null,null,null
union
select 2,3,null,null,null
select * from #original order by id asc;
with cteOriginal as
(
select *, RANK() over (partition by [SortOrder] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value] from
(
select top 50 [value], ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder]) sortedOrder
from cteOriginal
order by sortedOrder
) tmp
group by [value]
order by min(sortedOrder)
DROP TABLE #original
我可能不明白您所描述的一切。通过阅读您的问题和其他人的评论,我想这就是您要寻找的:
更新后的版本:
with cteOriginal as
(
select *, RANK() over (partition by [SortOrder] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value]
from cteOriginal
where id = (select MIN(tmp.id) from cteOriginal tmp where tmp.value = cteOriginal.value)
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])
我通过选择具有最小id(min(id))的重复值来摆脱重复值。您可以将其更改为使用max(id)。
初始版本:
with cteOriginal as
(
select *, RANK() over (partition by [column] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 'A' as [Column], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 'B' as [Column], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 'C' as [Column], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 'D' as [Column], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value]
from cteOriginal
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])
顺便说一句,我正在使用mssql 2005进行此查询。请发表评论,我们将对其进行完善。
问题内容: 我有一个数据库 我怎样才能选择该猫排序,?那是 问题答案: 这应该做…除了名称的双破折号“-”以外… 按第一个案例的顺序/何时将所有属于最高级别的项目放在第一层,或者将所有项目放在第一层的ID的第二层。因此,如果您有超过1000个条目,尝试使用提供的父* 1000个示例hack就不会成为问题。当父ID = 0时,第二个案例/时间将强制进入其分组列表的TOP及其下的所有子条目,但在下一个
我有下面的dataframe示例。 给定一个模板,我想根据列的新顺序更改行的顺序,因此它看起来像: 我找到了下面的线程,但是洗牌是随机的。Cmmiw。 洗牌数据帧行
我用的是拉威尔的背包,积垢舱。 如何将orderby()用于多列? 例子: 我看到src和orderby只接受一个参数。 有什么建议吗?
我对这件事还不熟悉,很困惑。
我的教授介绍了如何使用ArrayList创建Max Heap类。然后他让我们写一个maxHeapSort方法。我几乎成功地将堆按降序排序,但我假设排序应该按升序。现在我使用一个最大堆为[11,5,8,3,4,1]的ArrayList,它排序为[11,8,5,3,4,1]。 这是我的maxHeapSort代码: 下面是我的教授给出的heapifyDown方法: 这是我的测试代码:
我有一个pandas数据帧(df),我需要根据列值的计数对其进行排序。列的值是字符串。 例如,目标列的值为橙色、苹果色、香蕉色和桃色。单个计数(df['fruit'].value_counts())为: 香蕉2678 桃2250 橙色1765 苹果1691 结果我需要根据这些计数对初始数据帧(包括所有列等)进行排序。因此,在前2678行中,水果列中的值应为香蕉等