2010-12-21 83 views
1

我想有高效的查询来从我的表中获取一些行。请高效查询

这是我觉得我的表的最佳表现。

-Somedate is not duplicated - it is date of modifiedon 
-a,b,c are parent ids, let say countryCode 
-1,2,3,4 are subparent, let say citycode 
-guids are id of rows 
-true, false are values of rows - one can name this column - freshAir 


a 1 GUID somedate true 
a 1 GUID somedate true 
a 2 GUID somedate false 
a 2 GUID somedate false 
b 3 GUID somedate false 
b 3 GUID somedate false 
b 3 GUID somedate false 
b 4 GUID somedate false 
c 5 GUID somedate true 
c 6 GUID somedate true 
c 6 GUID somedate false 
c 6 GUID somedate false 
c 7 GUID somedate false 

我想COUNTRYCODE和citycode分组最近的行MAX(modifiedon),并在这个群体,我需要它有另外一个值(真,假)的元素。

及成果我想:

a 1 GUID somedate true 
a 2 GUID somedate false 
c 5 GUID somedate true 
c 6 GUID somedate false 
c 7 GUID somedate false 

看,在结果,我不希望有“B”的记载,因为所有行具有相同的值(假)。

编辑:

IDResearch CountryCode CityCode ReligionCode Date 
1   FR   PAR  CAT   11-11-2000 
2   FR   PAR  CAT   11-11-2002 
3   FR   STR  ISL   09-12-1975 
4   FR   STR  ISL   09-12-1995 
5   GR   ATE  PRA   09-12-1976 
6   GR   ATE  PRA   09-12-1986 
7   GR   SAL  PRA   09-12-1986 
8   ES   BCN  ATH   01-07-2001 
9   ES   BCN  ATH   01-08-2001 
10   ES   MAD  CAT   01-07-2008 
11   ES   VAL  CAT   01-07-2009 

我想从表研究的国家行,其中占主导地位的宗教是不一样的。因此,在法国巴黎的主导是天主教,但在斯特拉斯堡是伊斯兰教,所以我想从这个国家的最新记录:

2   FR   PAR  CAT   11-11-2002 
4   FR   STR  ISL   09-12-1995 

接下来,在希腊所有的城市都是一样relgion所以我不想从记录这个国家。

在西班牙城市占主导地位的宗教是不一样的,所以我想记录来自西班牙太

9   ES   BCN  ATH   01-08-2001 
    10   ES   MAD  CAT   01-07-2008 
    11   ES   VAL  CAT   01-07-2009 

我希望这将有助于和引进更多的清晰度。

回答

0

我认为你正在寻找的东西像(PostgreSQL系统):

SELECT * 
FROM myTable 
WHERE (countrycode, citycode, modifiedon) IN (SELECT countrycode, citycode, MAX(modifiedon) FROM myTable) 
0

试试这个:

WITH countries AS 
(
    SELECT countryCode 
    FROM researches T1 
    GROUP BY CountryCode 
    HAVING COUNT(DISTINCT ReligionCode) > 1 
), 
max_rows AS 
(
    SELECT researches.countryCode, cityCode, MAX(Date) AS Date 
    FROM countries 
    JOIN researches 
    ON countries.countryCode = researches.countryCode 
    GROUP BY researches.countryCode, cityCode 
) 
SELECT T2.* 
FROM max_rows AS T1 
JOIN researches AS T2 
ON T1.cityCode = T2.cityCode 
AND T1.countryCode = T2.countryCode 
AND T1.Date = T2.Date 
+0

我添加的例子。你能看看吗? – user278618 2010-12-22 00:32:45

0

或者您可以使用Rank() function

with countries as 
( select countryCode 
    from researches r 
    Group by CountryCode 
    having COUNT(distinct REligionCode) > 1 
), 
partitioned as 
(
    select r1.* 
      ,rank() over (partition by r1.countryCode, r1.cityCode order by r1.Date desc) as position 
    from researches r1 
    join countries c on r1.CountryCode = c.CountryCode 
) 
select * from partitioned where position = 1 

我不知道哪个选项效果最好..也许你可以让我们知道?

1

唯一的问题马克拜尔斯和狗耳朵的解决方案有是,他们取消仅在所有行相同religioncode国家。现在考虑的情况:

5   GR   ATE  PRA   09-12-1976 
6   GR   ATE  PRA   09-12-1986 
7   GR   SAL  PRA   09-12-1986 
8   GR   SAL  ISL 11-01-1985 

从逻辑上讲,我们还是应该忽略GR作为最终的研究表明其所有的PRA!这些查询并不包括我担心的情况。 如果你的情况,这是一个问题,我的解决办法是:

WITH LastResearch AS(
    SELECT R2.IDResearch,R2.countryCode,R2.CityCode,R2.ReligionCode,R2.Date FROM 
    ((select countryCode,CityCode,max(Date) Date 
     from researches R1 
     Group by countryCode,CityCode)A 
    INNER JOIN 
    researches R2 
    ON (A.countryCode=R2.countryCode AND A.CityCode=R2.CityCode AND A.Date=R2.Date))), 
FilteredCountry AS(
    SELECT countryCode FROM LastResearch 
    GROUP BY countryCode 
    HAVING COUNT(DISTINCT ReligionCode)>1 
) 
SELECT * FROM LastResearch 
WHERE countryCode IN (SELECT countryCode FROM FilteredCountry)