2011-01-28 75 views
0

我有一个数据帧有几列:与几个条件不同

SightingID, PA1, PA2, Area, PlotID

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

如果有几个SightingIDs对于相同的情节然后通过选择SightingID -

  1. 首先选择SightingID具有PA1 = O,如果有几个SightingID与PA1 = 0具有相同PlotID
  2. 然后选择区域最大值的那个。
  3. 如果对于一个PlotID,没有PA1 = 0的SightingID,只需将Area中的值设为最大。

我来到与

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

,我得到不同的PlotID与SightingID它具有最高的区域价值,但我不知道如何将我的第一个条件。

我知道我应该使用Distinct功能,但我不知道如何为它制定条件。如果有点混淆,但是如果有人能帮助我,那会很棒。谢谢

+1

与几个条件不同= **通过** ..集合! – Vishal 2011-01-28 20:04:46

+1

您可以将其格式化为更好的可读性吗?在试图理解你的情况时,穿过这段文字有点困难。 – 2011-01-28 20:06:18

回答

0

Group By可以用来代替不同的。根据SQL引擎的不同,它甚至可能会将查询计划重写为相同。

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

SELECT DISTINCT a, b FROM foo; 

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

不能使用积累了与不同的,然而,如果你想获得的最大一个值,你将需要使用GROUP BY。我不确定你的问题到底是什么

+0

我不知道如何把条件,我想要的东西像IF PA1 = O select *其中PA1 = 0组由PlotID ELSE select *其中SightingID =最大(SihtingID) – Sarah 2011-01-28 20:30:19

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