Пожалуйста, для эффективного запроса - PullRequest
1 голос
/ 22 декабря 2010

Я хочу иметь эффективный запрос, чтобы получить несколько строк из моей таблицы.

Вот, я думаю, лучшая презентация моей таблицы.

-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

Я хочу, чтобы самые последние строки MAX (Modified) были сгруппированы по коду страны и городу, и в этой группе мне нужны элементы, которые имеют другие значения (true, false).

И в результатеЯ хочу:

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", потому что все строки имеют одинаковое значение (false).

EDITED:

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

Далее, во Греции во всех городах одинаковая религия, поэтому я не хочузаписи из этой страны.

В испанских городах преобладает религия, это не то же самое, поэтому я тоже хочу записи из Испании

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

Я надеюсь, что это поможет и внесет больше ясности.

Ответы [ 4 ]

1 голос
/ 22 декабря 2010

Единственная проблема решения Mark Byers и Dog Ears состоит в том, что они отменяют только те страны, в которых одинаковый код религии во всех строках Теперь рассмотрим сценарий:

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

По логике вещей, мы все равно должны опустить 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)
0 голосов
/ 22 декабря 2010

Попробуйте это:

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 голосов
/ 22 декабря 2010

В качестве альтернативы вы можете использовать функцию Rank () :

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 

Я не уверен, какой вариант работает лучше всего ... может быть, вы дадите нам знать?

0 голосов
/ 22 декабря 2010

Я думаю, что вы ищете что-то вроде (postgreSQL):

SELECT *
FROM myTable
WHERE (countrycode, citycode, modifiedon) IN (SELECT countrycode, citycode, MAX(modifiedon) FROM myTable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...