我有一些针对不同情况的分析数据。每个案例都与一张或多张照片相关联。每张照片由两个用户分析。 存储的数据看起来像
我想要的是让SQL查询生成不一致结果,如下所示
有人可以帮助我实现这一目标吗?
感谢您分享宝贵的时间。
这是要用于测试的示例数据
Case Id,Photo Id,FeatureCheck,Result,CheckedBy
17116,173442,severity,none,24
17116,173442,severity,low,25
17116,175062,severity,none,26
17116,175062,severity,none,27
17116,175427,severity,medium,24
17116,175427,severity,high,28
17116,175748,severity,low,22
17116,175748,severity,none,30
17116,176031,severity,low,24
17116,176031,severity,low,29
17277,175309,severity,none,24
17277,175309,severity,none,25
17277,175649,severity,none,24
17277,175649,severity,none,25
答案 0 :(得分:1)
您可以使用INNER JOIN
SELECT
t1.`Case Id`, t1.`Photo Id`,t1.FeatureCheck,t1.CheckedBy,t1.Result,t2.CheckedBy,t2.Result
FROM test t1
JOIN test t2
ON (t1.`Case Id`=t2.`Case Id`
AND t1.`Photo Id`= t2.`Photo Id`
AND t1.CheckedBy!=t2.CheckedBy
AND t1.CheckedBy<t2.CheckedBy)
WHERE t1.Result!=t2.Result;
答案 1 :(得分:1)
方法
建议的解决方案的关键是,对于案例,照片和功能的每种组合,您总是会有2条评论。
按所述组合进行分组,您将得到大小为2的分组。因此,通过将MIN
/ MAX
应用于result
/ {{1 }}。
您现在需要检查的是,用户ID的最小值和结果的最小值是否属于同一组记录。如果是这样,则说明您已完成,否则必须交换用户ID或结果。等效于交换,您必须为checkedby
字段应用MAX
而不是MIN
,反之亦然。
可以通过根据用户ID和查看结果计算组内的等级并检查它们是否与给定记录匹配来执行检查。请注意,在任何给定组中,匹配谓词的结果都是恒定的。因此,我们可以将此谓词添加到分组条件中。
查询1(需要Mysql 8)
result
SELECT caseid
, photoid
, featurecheck
, MIN(checkedby) user1
, CASE reversal WHEN 0 THEN MIN(result) ELSE MAX(result) END review1
, MAX(checkedby) user2
, CASE reversal WHEN 0 THEN MAX(result) ELSE MIN(result) END review2
FROM (
SELECT t.*
, CASE WHEN RANK() OVER (PARTITION BY caseid, photoid, featurecheck ORDER BY result) = RANK() OVER (PARTITION BY caseid, photoid, featurecheck ORDER BY checkedby)
THEN 0
ELSE 1
END reversal
FROM test t
) tbase
GROUP BY caseid
, photoid
, featurecheck
, reversal
HAVING MIN(result) <> MAX(result)
;
拥有 Approach 部分中提到的前提,having子句选择那些评论不匹配的情况。
Here是数据库提琴。
查询2
可以模拟使用早期MySQL版本中缺少的reversal
函数。
RANK
Here是数据库提琴。
答案 2 :(得分:0)
HAVING子句可以为您显示结果。
SELECT caseid, photo_id , feature_check, agreedupon
FROM table1
GROUP BY caseid, photo_id, feature_check, agreedupon
HAVING count(agreedupon) = 1
答案 3 :(得分:0)
我将使用子查询来获取case_id和photo_id,但结果不同:
SELECT
p.case_id,
p.photo_id,
p.feature_check,
p.result,
p.checked_by
FROM photos p
INNER JOIN (
SELECT
case_id,
photo_id,
count(distinct result)
FROM
photos
GROUP BY
case_id,
photo_id
HAVING
count(distinct result) > 1
) sub ON p.case_id = sub.case_id AND p.photo_id = sub.photo_id
;