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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Группировка записей, для выборки PK 
V
    Опции темы
Yagmort
Дата 10.3.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

DECLARE @idf INT 
DECLARE @maxdate date 
SELECT 
    @idf=[id_field]
    ,@maxdate=MAX([date])
FROM [mybase].[dbo].[prod]
GROUP BY [id_field]        
SELECT
 [id_table1]
,[id_table2]
FROM [mybase].[dbo].[prod]
WHERE ([id_field]=@idf) AND ([dati]=@maxdate)


Помогите вывести все PK,  а ими являются ( [id_table1] и [id_table2]) при условии, что не должны повторятся значения в поле [id_field], и при условии, что сгрупиированное значение должно быть с максимальной датой, [id_field] - это FK

впринцепе так работает все, но как получить от этих полей их id [id_table1] и [id_table2]
Код

SELECT 
    [id_field]
    ,MAX([date]) AS date
FROM [mybase].[dbo].[prod]
GROUP BY [id_field]  
        

Это сообщение отредактировал(а) Yagmort - 10.3.2011, 11:16
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Yagmort @  10.3.2011,  11:04 Найти цитируемый пост)
SELECT 
    @idf=[id_field]
    ,@maxd=MAX([date])
FROM [mybase].[dbo].[prod]
GROUP BY [id_field]   

какие значения примут переменные, если групп более одной? smile 

Если мои фантазии навеяные феерическим бредом в топикстарте, сколь нибудь близки к реалиям, то решается эта задача както так:
Код

select 
    [id_field]
    ,[date]
    ,[id_table1]
    ,[id_table2]
from (
SELECT 
   t.*
   ,row_number()/*dence_rank()*/ over(partition by id_field order by [date] desc) rnc
FROM [mybase].[dbo].[prod] as t
)
where rnc = 1


В качестве домашнего задания - изучить различия row_number и dence_rank и решить для себя какая именно функкция тут должна быть применена

Если имеем версию MSSQL младше 2005, ищем по форуму ключевую фразу "бабушкин метод".




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


Опытный
**


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

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



Цитата(Zloxa @ 10.3.2011,  11:23)
Цитата(Yagmort @  10.3.2011,  11:04 Найти цитируемый пост)
SELECT 
    @idf=[id_field]
    ,@maxd=MAX([date])
FROM [mybase].[dbo].[prod]
GROUP BY [id_field]   

какие значения примут переменные, если групп более одной? smile 

Если мои фантазии навеяные феерическим бредом в топикстарте, сколь нибудь близки к реалиям, то решается эта задача както так:
Код

select 
    [id_field]
    ,[date]
    ,[id_table1]
    ,[id_table2]
from (
SELECT 
   t.*
   ,row_number()/*dence_rank()*/ over(partition by id_field order by [date] desc) rnc
FROM [mybase].[dbo].[prod] as t
)
where rnc = 1


В качестве домашнего задания - изучить различия row_number и dence_rank и решить для себя какая именно функкция тут должна быть применена

Если имеем версию MSSQL младше 2005, ищем по форуму ключевую фразу "бабушкин метод".

Синтаксис неправильный около конструкции WHERE, переписал запрос, результата мне нужного нет. мне надо получить  [id_table1] и [id_table2], это как результат, но при условии не повтрояющихся id_field и где не повторяющиеся id_field соответсвенно будут напротив максимальных дат. Результатом должны быть id этих строк.

Это сообщение отредактировал(а) Yagmort - 10.3.2011, 11:59
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



укажите алиас подзапросу и учите синтаксис.



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


Опытный
**


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

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



Цитата(Zloxa @ 10.3.2011,  11:59)
укажите алиас подзапросу и учите синтаксис.

Ставил псевдоним туда рез-тата нет, а жалуется на
Код

 select 
    id_tovara
    ,id_operacii
from (
SELECT
  и скобку после 

Это сообщение отредактировал(а) Yagmort - 10.3.2011, 12:03
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Yagmort @  10.3.2011,  11:53 Найти цитируемый пост)
мне надо получить  [id_table1] и [id_table2], это как результат, но при условии не повтрояющихся id_field и где не повторяющиеся id_field соответсвенно будут напротив максимальных дат.

вы сами понимаете написанное?

Добавлено @ 12:04
приведите тестовый набор данных и ожидаемый результат для этого набора.

Тестовый набор данных предпочтительнее представлять в виде :
Код

select 1 id, 7 val
union all select 2 id, 8 val
union all....


Это сообщение отредактировал(а) Zloxa - 10.3.2011, 12:11


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


Опытный
**


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

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



Цитата(Zloxa @ 10.3.2011,  12:01)
Цитата(Yagmort @  10.3.2011,  11:53 Найти цитируемый пост)
мне надо получить  [id_table1] и [id_table2], это как результат, но при условии не повтрояющихся id_field и где не повторяющиеся id_field соответсвенно будут напротив максимальных дат.

вы сами понимаете написанное?

Естественно 

выбрать все [id_table1] и [id_table2] (т.е. PK), где id field не может повторятся (например 1,2,5,5,5,6,6,1,2)- напротив них стоит дата. Так мне надо получить 1,2,5,6 где выбрать эти поля только с максимальными датами и временем из возможных (1,2,5,5,5,6,6,1,2)

Добавлено через 2 минуты и 33 секунды
Вот запрос - работает верно но не могу получить id этих записей !!! 
Код

SELECT 
    [id_field]
    ,MAX([date]) AS date
FROM [mybase].[dbo].[prod]
GROUP BY [id_field]  


Добавлено через 9 минут и 59 секунд
Цитата(Zloxa @ 10.3.2011,  12:01)
Цитата(Yagmort @  10.3.2011,  11:53 Найти цитируемый пост)
мне надо получить  [id_table1] и [id_table2], это как результат, но при условии не повтрояющихся id_field и где не повторяющиеся id_field соответсвенно будут напротив максимальных дат.

вы сами понимаете написанное?

Добавлено @ 12:04
приведите тестовый набор данных и ожидаемый результат для этого набора.

Тестовый набор данных предпочтительнее представлять в виде :
Код

select 1 id, 7 val
union all select 2 id, 8 val
union all....

Все разобрался благодар
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Yagmort @  10.3.2011,  12:07 Найти цитируемый пост)
выбрать все [id_table1] и [id_table2] (т.е. PK), где id field не может повторятся (например 1,2,5,5,5,6,6,1,2)- напротив них стоит дата. Так мне надо получить 1,2,5,6 где выбрать эти поля только с максимальными датами и временем из возможных (1,2,5,5,5,6,6,1,2)

Именно так и должен работать предложенный мною вариант.
Код

SQL> with t as (
  2   select 1 id, date '2001-01-01' dt from dual
  3   union all select 2, date '2001-01-02' from dual
  4   union all select 5, date '2001-01-03' from dual
  5   union all select 5, date '2001-01-04' from dual
  6   union all select 5, date '2001-01-05' from dual
  7   union all select 6, date '2001-01-06' from dual
  8   union all select 6, date '2001-01-07' from dual
  9   union all select 1, date '2001-01-08' from dual
 10   union all select 2, date '2001-01-07' from dual
 11  )
 12  select id,dt
 13  from (
 14    select
 15       t.*
 16       ,row_number() over(partition by id order by dt desc) rnc
 17    from t
 18  )
 19  where rnc = 1
 20  ;
 
        ID DT
---------- -----------
         1 08.01.2001
         2 07.01.2001
         5 05.01.2001
         6 07.01.2001




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




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


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

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