道歉,如果答案显而易见,但是尽管进行了大量的研究并尝试了不同的命令,解决方案也让我失望了(我更多的是词典编纂者而不是开发者)。
我们有一个表格,由于各种原因最终导致一些行在关键单元格中具有重复值。样机看起来像这样:
Unique_ID | E_ID | Date | User_ID | V_value
1 | 500 | 2012-05-12 | 23 | 3
2 | 501 | 2012-05-12 | 23 | 3
3 | 501 | 2012-05-13 | 23 | 1
4 | 502 | 2012-05-13 | 23 | 2
5 | 503 | 2012-05-12 | 23 | 2
6 | 7721 | 2012-05-22 | 8845 | 3
7 | 7722 | 2012-05-22 | 8845 | 3
8 | 7722 | 2012-05-22 | 8845 | 3
9 | 7723 | 2012-05-22 | 8845 | 3
因此我需要输出的行是Unique_ID 2& 3和7&因为它们在E_ID和User_ID字段方面是相同的。其他字段的值与我们的问题无关。所以我想要的是理想的:
Unique_ID | E_ID | Date | User_ID | V_value
2 | 501 | 2012-05-12 | 23 | 3
3 | 501 | 2012-05-13 | 23 | 1
7 | 7722 | 2012-05-22 | 8845 | 3
8 | 7722 | 2012-05-22 | 8845 | 3
由于与数据有关的原因,我需要输出显示编辑功能(特别是勾选框或至少删除功能),因为我需要手动浏览表格并丢弃其中一个或另一个根据无法使用SQL命令确定的决策/条件进行复制。
我最接近的是:
SELECT *
FROM ( SELECT E_ID, User_ID, COUNT(Unique_ID)
AS V_Count
FROM TableName
GROUP BY E_ID, User_ID
ORDER BY E_ID )
AS X
WHERE V_Count > 1
ORDER BY User_ID ASC, E_ID ASC
它确实给了我带有重复的行,但是因为我创建了V_Count列来给我重复项:
E_ID | User_ID | V_Count
501 | 23 | 2
7722 | 8845 | 2
输出没有给我我需要的删除选项 - 它说它是因为没有唯一的ID而我得到了它,因为它将它们放在同一行中。有没有办法在不丢失Unique_ID的情况下执行此操作,因此我不会丢失删除功能?
答案 0 :(得分:0)
一种简单的方法使用public static double GetDistance(int x0, int y0, int x1, int y1)
{
int dX = y1 - y0;
int dY = x1 - x0;
return Math.Sqrt(dX * dX + dY * dY);
}
:
exists
将每个组合放在包含所有ID的单行上的另一种方法是:
select t.*
from tablename t
where exists (select 1
from tablename t2
where t2.e_id = t.e_id and t2.date = t.date and
t2.user_id = t.user_id and t2.v_value = t.v_value and
t2.unique_id <> t.unique_id
);
答案 1 :(得分:0)
如果有多行,您可以使用聚合来检查给定的user_id和e_id。然后将其与您的表连接以获取结果中的所有列。
select t1.*
from tablename t1
join (
select e_id,
user_id
from tablename
group by e_id,
user_id
having count(*) > 1
) t2
on t1.e_id = t2.e_id
and t1.user_id = t2.user_id
使用USING
子句可以更清晰地表达:
select *
from tablename t1
join (
select e_id,
user_id
from tablename
group by e_id,
user_id
having count(*) > 1
) t2 using (e_id, user_id)