筛选SQL中列值的组合

时间:2017-12-21 07:57:30

标签: sql sql-server tsql

我想过滤所有与某些Attribut具有相同AttributValue的人作为另一个人 我有以下查询:

SELECT
  p1.keyValue,
  p1.Displayname,
  p2.keyValue,
  p2.Displayname,
  p1.ImportantAttrName,
  p1.ImportantAttrValue
FROM Person p1 WITH (NOLOCK)
JOIN Person p2 WITH (NOLOCK)
  ON p1.ImportantAttr = p2.ImportantAttr
WHERE p1.keyValue != p2.keyValue
AND p1.ImportantAttrValue = p2.ImportantAttrValue

使用此查询,我将获得两次所有条目,因为每个人都将在p1和p2中。 所以结果将如下所示:

I123    Freddy Krüger   A123    The Horsemen   Moviecategorie    Horror
A123    The Horsemen    I123    Freddy Krüger   Moviecategorie    Horror

但是出于分析的目的,如果我只能获得p1.keyvalue和p2.keyvalue的组合一次,而不考虑两个列中的值,那将是很好的。

到目前为止,我通过导出到excel并在那里进行清理来完成此操作,但是有没有办法解决查询问题而无法获得此问题"重复"?

3 个答案:

答案 0 :(得分:3)

使用where p1.keyValue < p2.keyValue

SELECT
    p1.keyValue,
    p1.Displayname,
    p2.keyValue,
    p2.Displayname, 
    p1.ImportantAttrName,
    p1.ImportantAttrValue
FROM Person p1 WITH (NOLOCK)
INNER JOIN Person p2 WITH (NOLOCK)
    ON p1.ImportantAttr = p2.ImportantAttr
WHERE
    p1.keyValue < p2.keyValue AND       -- change is here
    p1.ImportantAttrValue = p2.ImportantAttrValue;

这将确保您不会看到重复的对。要在数字上理解其工作原理,请考虑两个关键值12。使用条件!=1-22-1都符合该条件。但使用<只会产生1-2

答案 1 :(得分:2)

你可以转:

df2 = df.loc[:, pd.to_numeric(df.columns, errors='coerce') < 24]

为:

on p1.ImportantAttr = p2.ImportantAttr

整个查询可能如下所示:

on p1.ImportantAttr = p2.ImportantAttr and p1.keyValue < p2.keyValue

答案 2 :(得分:0)

这可能是不同的方法,但可以得到预期。

使用分区计数(*):

select count(*) over(partition by Attr) as RepeatCount, * from (
select keyValue,DisplayName,ImportantAttr + ' ' +ImportantAttrValue as Attr
  from tblTest) tblTemp

根据上面的查询,您将得到如下结果

> RepeatCount    keyValue     DisplayName          Attr
> 
> 1       P321        The Ironman          Generalcategorie Test 
> 2       I123        Freddy Krüger        Moviecategorie Horror 
> 2       A123        The Horsemen         Moviecategorie Horror

从此结果中,您可以按Repeatcount&gt;过滤记录1