我有非常简单的数据表
ffmpg
我需要表中的独特结果, 我需要id1和id2之间的一组组合对,其中集合中的所有元素都是唯一的
来自样本表的SELECT的可验证结果是:
pk | id1 | id2
1 | 1 | 2
2 | 1 | 3
3 | 10 | 2
4 | 10 | 3
5 | 20 | 2
6 | 20 | 3
或
1| 1|2
4|10|3
或
2| 1|3
3|10|2
或
1| 1|2
6|20|3
或
2| 1|3
5|20|2
或
3|10|2
6|20|3
但我只需要第一次出现可能的结果。
使用4|10|3
5|20|2
或GROUP BY id1
不能完成我需要的工作。
答案 0 :(得分:0)
您可以试试这个:
DataTable newTable = view.ToTable(true, "column1", "column2",...);
会做你的任务。
以下是示例
DataTable table = new DataTable("NewTable");
DataColumn column = new DataColumn("ID1", typeof(System.Int32));
table.Columns.Add(column);
column = new DataColumn("ID2", typeof(System.Int32));
table.Columns.Add(column);
DataRow row = table.NewRow();
row.ItemArray = new object[] { 1, 2};
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 2, 3};
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 10, 2};
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 10, 2 };
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 20, 2};
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 20, 3};
table.Rows.Add(row);
// Mark all rows as "accepted". Not required
// for this particular example.
table.AcceptChanges();
DataView view = new DataView(table);
view.Sort = "ID1";
DataTable newTable = view.ToTable(true, "ID1", "ID2");
Console.WriteLine("New table name: " + newTable.TableName);
foreach (DataRow row1 in newTable.Rows)
{
Console.WriteLine();
for(int x = 0; x < newTable.Columns.Count; x++)
{
Console.Write(row1[x].ToString() + " ");
}
}
Console.ReadLine();
但是你的问题仍然不明确,所以我不确定它是否符合你的要求。如果它是您的概率的解决方案,请添加评论。
答案 1 :(得分:0)
就在这里。这是一个有趣的问题。这段代码对我有用。我已经有点随机,所以每次都会得到不同的结果。
/*create table SourceData (
pk int,
id1 int,
id2 int
)
insert into SourceData (pk,id1,id2)
values
( 1 , 1 , 2),
( 2 , 1 , 3),
( 3 , 10 , 2),
( 4 , 10 , 3),
( 5 , 20 , 2),
( 6 , 20 , 3)
*/
Create table #temp1 (pk int not null);
--Pick a first row at random
insert into #temp1 (pk)
select top 1 pk from SourceData
order by NEWID()
;
declare @KeepGoing int = 1;
-- for as long as we keep finding new rows in SourceData
WHILE( @KeepGoing > 0 )
BEGIN
insert into #temp1 (pk)
-- find 1 row in SourceData where no value matches an existing picked row
select top 1 pk from SourceData
where id1 not in (select id1 from #temp1 T inner join SourceData SD on T.pk = SD.pk)
and id2 not in (select id2 from #temp1 T inner join SourceData SD on T.pk = SD.pk)
order by NEWID()
SET @KeepGoing = @@ROWCOUNT
END
-- display results
select SD.* from #temp1 T inner join SourceData SD on T.pk = SD.pk
drop table #temp1
答案 2 :(得分:0)
此查询应该可以解决问题
select min(pk), id1, id2 from table_name group by id1, id2;