与几个条件不同

时间:2011-01-28 20:01:41

标签: sql distinct

我有一个包含多个列的数据框:

SightingID, PA1, PA2, Area, PlotID

不同的SightingID(与PA1,PA2和区域相关联)具有相同的PlotID。我想从几个条件中为每个PlotID选择一个SightingID(即,一行)(即,获得具有唯一PlotID的DF)。

如果同一个地块有多个SightingID,请按 -

选择SightingID
  1. 首先选择具有PA1 = O的SightingID,如果有多个SightingID且PA1 = 0且具有相同的PlotID
  2. 然后选择Area的最大值。
  3. 如果对于一个PlotID,PA1 = 0时没有SightingID,只需选择具有Area最大值的那个。
  4. 我来了

    SELECT SightingID, PA1, PA2, PlotID, MAX(Area) FROM DF GROUP BY PlotID
    

    我获得了具有最高Area值的SightingID的不同PlotID,但我不知道如何合并我的第一个条件。

    我知道我应该使用Distinct功能,但我不知道如何用它来制定条件。如果它有点令人困惑但是如果有人可以帮助我,那就太好了。感谢

2 个答案:

答案 0 :(得分:0)

可以使用Group By代替distinct。根据SQL引擎,它甚至可以将查询计划重写为相同。

以下两个查询在语义上是相同的:

SELECT DISTINCT a, b FROM foo;

SELECT a, b FROM foo GROUP BY a, b;

但是,您不能使用不同的聚合,因此,如果您尝试获取值的最大值,则需要使用GROUP BY。我不确定你的问题究竟是什么

答案 1 :(得分:0)

它并不完全清楚你想要什么。如果你想选择与最大面积相关的SightingID,但想要PA1 = 0的记录,那么你就是这样做的。

SELECT 
  case when maxPlotZero.Area is null then
          maxPlot.SightingID
        else 
          maxPlotZero.SightingID
  end SightingID

FROM 
 DF
 LEFT JOIN

 (

   SELECT 


         PlotID, 
         MAX(Area) Area
   FROM 
           DF
    WHERE
        PA1=0

    GROUP BY 
        PlotID
)  maxPlotZero

ON df.PlotId= maxPlotZero.PlotID
   and df.Area= maxPlotZero.Area
LEFT JOIN

(

SELECT 



         PlotID, 
         MAX(Area) 
FROM 
       DF

GROUP BY 
    PlotID
)  maxPlot

  ON df.PlotId= maxPlot.PlotID
   and df.Area= maxPlot.Area