Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка из таблицы, MS Server 2005, внутренее обьединение 
V
    Опции темы
Green
  Дата 24.9.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



есть немаленькая таблица 'A' (id, id2, Date, BeginTime, EndTime)

хочу выбрать уникальные записи по полю id, 
дата дублируется, так как время может быть разное.
Нужно все максимальное smile  

как я, походу неправильно, делаю : 

Код

SELECT
      unq.id,
      unq.MaxDate as Date,
      A.BeginTime,
      unq.MEndTime as EndTime,
      A.id2
FROM A 
     INNER JOIN (
                 SELECT
                       A.id,
                       MAX(A.Date) as MaxDate,
                       MAX(A.EndTime) as MEndTime
                 FROM A 
                 WHERE A.Date BETWEEN '2010/09/01' AND '2010/09/19'
                 GROUP BY A.id
                 ) unq on             (olc.id = unq.id) AND
                                                                                                                        /*(A.Date = unq.MaxDate) AND*/
                                           (A.EndTime = unq.MEndTime)






подскажите грамотную реализацию

спасибо.
PM   Вверх
Gluttton
Дата 24.9.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(Green @  24.9.2010,  17:42 Найти цитируемый пост)
хочу выбрать уникальные записи по полю id, 

Цитата(Green @  24.9.2010,  17:42 Найти цитируемый пост)
Нужно все максимальное   


Что должен вернуть запрос для таких данных:
Цитата

'A' (id, id2, Date, BeginTime, EndTime)

1    1     01:01:2010    01:01:01     10:10:10
1    1     01:01:2009    02:02:02     05:05:05
1    2     01:01:2008    03:03:03     05:05:05

?




--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 24.9.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



А зачем тут вообще связывание? зачем вторая копия таблицы?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Green
Дата 25.9.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



Gluttton

верхняя 
Цитата
1    1     01:01:2010    01:01:01     10:10:10


вот если бы вот так, 

Цитата

'A' (id, id2, Date, BeginTime, EndTime)

1    1     01:01:2010    01:01:01     02:20:20
1    1     01:01:2009    02:02:02     05:05:05
1    2     01:01:2010    03:03:03     05:05:05


то была нижняя  
Цитата
1    2     01:01:2010    03:03:03     05:05:05

если есть несколько дублирующихся date у id=1, то BeginTime, EndTime не пересекаются по времени. 
т.е. 

Цитата

1    3     01:01:2010    09:20:00     09:30:00
1    4     01:01:2010    10:01:01     10:20:20
1    1     01:01:2010    10:20:21     10:30:21




Akina
код в студию.
PM   Вверх
Akina
Дата 25.9.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

select id, max(id2), max(Date), max(BeginTime), max(EndTime)
from table 
group by id

Однако правильность такого кода диалектозависима - одни СУБД дадут верные результаты, другие - лажу.
Указывай СУБД.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Green
Дата 25.9.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



Akina,

макс из поля "id2" мне не нужно, это поле как раз мне нужно и объединить /добавить .. 
может я чёт не пральна понял.. 
 
PM   Вверх
Zloxa
Дата 25.9.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Green @  24.9.2010,  17:42 Найти цитируемый пост)
как я, походу неправильно, делаю : 

а что именно тут "походу неправильно"?

если я правильно понял задачу:
1)
Код

select * from (select a.*, row_number() over (partition by id oder by a.date desc,a.time desc) rn from a) where rn = 1

если (id,date,time) не уникально и, в случае, если более одной записи попадают под критерий "максимальный" и надо вывести их всех, вместо row_number, следует использовать dense_rank
2) stff Бабушкин метод
Цитата(Akina @  25.9.2010,  10:28 Найти цитируемый пост)
Однако правильность такого кода диалектозависима - одни СУБД дадут верные результаты, другие - лажу.

Не мог бы ты малость уточнить?
Я не смог придумать как это выражение может быть реализовано неоднозначно на разных платформах.

Это сообщение отредактировал(а) Zloxa - 27.9.2010, 10:32


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 25.9.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  25.9.2010,  15:10 Найти цитируемый пост)
Я не смог придумать как это выражение может быть реализована неоднозначно на разных платформах.

Да, ты прав, я неверно выразился. Вернее, не на том материале. Я имел в виду случай, когда следует выбрать дополнительные поля, не входящие ни в группировку, ни в групповую операцию.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Green
Дата 27.9.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



Zloxa,


Цитата

неправильно, делаю


это точно, ибо простая проверка показывает, лажу.. 

результ. набор строк частично "правильный".. ,
т.е.  EndTime и BeginTime получаются из разных строк.

я не знаю какие поля нужно выбирать 

Код

SELECT
      unq.id,
      unq.MaxDate as Date,
      A.BeginTime,
      unq.MEndTime as EndTime,
      A.id2


и не знаю по каким полям делать join,  что б ничего не потерять и естесна, что бы всё уникальное было smile.. 

Код

on             (olc.id = unq.id) AND
                                                                                                                        /*(A.Date = unq.MaxDate) AND*/
                                           (A.EndTime = unq.MEndTime)



аналитические функции это чудесно, но абсолютно не понятно smile 
если не западло пару строк пояснения

Код

select * 
from 
        (select a.*,
                   row_number() over 
                               (partition by id oder by a.date desc,a.time desc)
          from a) 
where rn = 1



PM   Вверх
Zloxa
Дата 27.9.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Green @  27.9.2010,  10:12 Найти цитируемый пост)
я не знаю какие поля нужно выбирать 

Цитата(Green @  27.9.2010,  10:12 Найти цитируемый пост)
и не знаю по каким полям делать join

тогда до тех пор, пока вы не сможете внятно изложить задачу, которая перед вами стоит, любая попытка дать Вам каой либо совет обречена.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Green
Дата 27.9.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



Zloxa

[quote]
я не знаю какие поля нужно выбирать  
и не знаю по каким полям делать join 
[/qute]

это касается, написаного мной запроса.

и еще раз 
задача звучит так :  

есть таблица 'A' (id, id2, Date, BeginTime, EndTime)

выбрать униальные записи по полю id +  условие : максимальная дата и время+нужны все поля из таблицы.

Это сообщение отредактировал(а) Green - 27.9.2010, 12:29
PM   Вверх
Akina
Дата 27.9.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Green @  27.9.2010,  13:28 Найти цитируемый пост)
условие : максимальная дата и время

Это поле Date?
В таком случае Zloxa тебе уже указал ответ(ы).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Green
Дата 27.9.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.6.2005

Репутация: нет
Всего: нет



thx2ALL

вот этот код решил вопрос

Код

select * from (select a.*, row_number() over (partition by id oder by a.date desc,a.time desc) rn from a) where rn = 1




Это сообщение отредактировал(а) Green - 27.9.2010, 13:25
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.