Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
Вопрос простой как мне кажется - но давно не занимался уже

поля такие

ID NAME DATE

1 FFFFF 01.08.2012
2 DDDDD 04.01.2000
3 CCC 30.09.2011

Результатом запроса (без хранимых процедур) должна быть одна запись с датой, наибольшей из таблицы

---------------------------------------------
Не забудь поставить фильтр между мозгами и языком!
Best regards/Bol
5 сен 12, 12:22    [13116730]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
max()
5 сен 12, 12:24    [13116754]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
и будет три записи - а мне нужна одна
5 сен 12, 12:25    [13116770]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Bol
и будет три записи - а мне нужна одна
Это вы фантазируете или уже проверили?
5 сен 12, 12:27    [13116787]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
ибо я выбрать хочу всю запись
5 сен 12, 12:28    [13116795]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
SELECT TOP 1 * FROM Table ORDER BY date DESC
5 сен 12, 12:29    [13116806]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Bol
и будет три записи - а мне нужна одна
Почему три?
Можно и так:
SELECT TOP 1 * FROM T ORDER BY [DATE] DESC;
Если возможны несколько равных максимальных дат, и нужны они все, то
SELECT TOP 1 WITH TIES * FROM T ORDER BY [DATE] DESC;
5 сен 12, 12:29    [13116808]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Bol
ибо я выбрать хочу всю запись
И что-то не получается?
5 сен 12, 12:30    [13116814]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
Select
MAX(DATE)
FROM
T_TABLE

дает одну запись

а если выбирать все поля и с группировкой по ним то три конечно

правда работаю с сервером через интерпритатор - но запрос то простой вроде
5 сен 12, 12:31    [13116823]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
интерпритатор хреново упорядочивает - потому
TOP 1

не катит
5 сен 12, 12:32    [13116831]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Bol
интерпритатор хреново упорядочивает - потому
TOP 1

не катит
Какой еще такой "интерпритатор"? O_o
5 сен 12, 12:33    [13116842]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
Решил проблему - да 1с-кий... какой же еще
чтоб простые вещи сделать надо потанцевать с бубном
5 сен 12, 12:36    [13116872]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Bol
Решил проблему - да 1с-кий... какой же еще
чтоб простые вещи сделать надо потанцевать с бубном
Форум по 1с рядом.
5 сен 12, 12:38    [13116896]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bol
Member

Откуда:
Сообщений: 1427
ок - пусть будет для SQL

Тогда уточним задачу

В приведенной выше таблице надо по каждому NAME отобрать значение, которое соответствует максимальной дате

То есть одному NAME может соответствовать несколько записей с разными DATE и надо выбрать только одну с наибольшей

Результат запроса должен содержать неповторяющиеся NAME с их ID и соответственно наибольшей датой


PS: я вопрос не по 1с задаю здесь
так что где и что, Сергей Алексеевич я давно уже хорошо ориентируюсь :)
5 сен 12, 12:53    [13117073]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Bobby
Member

Откуда:
Сообщений: 631
Bol,
Вот решение. Вьюха, которая у меня показывает текущее состояние процесса. состояния могут меняться и каждое состояние фиксируется:

ALTER VIEW [dbo].[vRULE_STATE_CURRENT]
AS
    SELECT  s1.ID ,
            s1.RULE_ID ,
            s1.RULE_NAME ,
            s1.[STATUS] ,
            s1.[DESC] ,
            s1.DATE_START
    FROM    dbo.ui_JUNOS_FIREWALL_RULE_STATES s1
            INNER JOIN ( SELECT RULE_ID ,
                                MAX(DATE_START) AS EFF_DATE
                         FROM   dbo.JUNOS_FIREWALL_RULE_STATES
                         GROUP BY RULE_ID
                       ) s2 ON s1.RULE_ID = s2.RULE_ID
                               AND s2.EFF_DATE = s1.DATE_START

допилишь под свои поля.
Успехов
5 сен 12, 13:01    [13117168]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Bol
PS: я вопрос не по 1с задаю здесь
так что где и что, Сергей Алексеевич я давно уже хорошо ориентируюсь :)
Тогда не рассказывайте нам про интерпретаторы, которые не дают те или иные конструкции использовать.
5 сен 12, 13:08    [13117212]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Bol,

вот же, сегодня ссылку давали
5 сен 12, 13:11    [13117251]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
alv_b
Member

Откуда:
Сообщений: 4
create table test(
id int,
name varchar(10),
d datetime
);

insert into test
(id,name,d) values
(1,'a','2012-09-01');

insert into test
(id,name,d) values
(2,'b','2012-09-01');

insert into test
(id,name,d) values
(3,'b','2012-09-02');

insert into test
(id,name,d) values
(4,'a','2012-09-02');

insert into test
(id,name,d) values
(5,'a','2012-09-03');


select t.*
from
(
select
tt.*,
ROW_NUMBER() OVER (partition by tt.name ORDER BY tt.d desc, tt.id asc) RN
from test tt
) t
where t.RN = 1;

id name d RN
5 a 2012-09-03 00:00:00.000 1
3 b 2012-09-02 00:00:00.000 1
5 сен 12, 13:36    [13117500]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Lord_Nikon
Member

Откуда: Saint-Petersburg
Сообщений: 12
Bobby,
Привествую. Совсем замучился с похожим запросом, вроде бы просто должно быть, но не поддается мне.
Суть такова:
две таблицы:
--Таблица данных Td относящихся к объекту, определенному в таблице Ztt1
CREATE TABLE [dbo].[td] (
  [idd] int NOT NULL, --идентификатор записи данных
  [idz] int NOT NULL, --идентификатор объекта которому принадлежат данные
  [kol] decimal(4, 2) NOT NULL, --показатель
  [datpok] datetime DEFAULT getdate() NOT NULL -- дата показателя
)
ON [PRIMARY]
GO

INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (1, 1, 1.5, '20130101')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (2, 1, 1.6, '20130116')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (3, 1, 2, '20130130')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (4, 2, 2.1, '20130115')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (5, 2, 2.2, '20130116')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (6, 3, 1, '20130117')
GO
INSERT INTO [dbo].[td] ([idd], [idz], [kol], [datpok])
VALUES (7, 1, 1.2, '20130201')
  
--Таблшица объектов названий (название объекта менятся, зависит от даты )
CREATE TABLE [dbo].[ztt1] (
  [idz] int NOT NULL,--идентификатор записи таблицы
  [idtt] int NOT NULL, --идентификатор объекта
  [namez] varchar(50) COLLATE Cyrillic_General_CI_AS NOT NULL, --наимнование объекта
  [datz] datetime DEFAULT getdate() NOT NULL --дата изменения наименования
)
ON [PRIMARY]
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (1, 1, N'PTK1', '20130101')
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (2, 1, N'PTKK2', '20130115')
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (3, 1, N'PTK3', '20130117')
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (4, 2, N'GGG', '20130101')
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (7, 3, N'Test', '20130101')
GO
INSERT INTO [dbo].[ztt1] ([idz], [idtt], [namez], [datz])
VALUES (8, 3, N'Test2', '20130201')
GO



Хочется получить данные показателей с указанием к какому объекту они принадлежат, в зависимости от дат

результат выборки ожидается примерно такой:
idd       idz      kol  datpok      namez
1 1 1,5 01.01.2013 PTK1
2 1 1,6 16.01.2013 PTKK2
3 1 2 30.01.2013 PTK3
4 2 2,1 15.01.2013 GGG
5 2 2,2 16.01.2013 GGG
6 3 1 17.01.2013 Test1
7 1 1,2 01.02.2013 PTK3

Профи SQL, помогите, пожалуйста.
6 фев 13, 18:39    [13886617]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Lord_Nikon, 8947782
6 фев 13, 19:07    [13886722]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Lord_Nikon
Member

Откуда: Saint-Petersburg
Сообщений: 12
Cygapb-007,

благодарю, но, к сожалению, не помогает... попробую побиться еще с этими примерами..
6 фев 13, 21:06    [13887277]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
select
 t.*, z.namez
from
 dbo.td t outer apply
 (select top (1) namez from dbo.ztt1 where idtt = t.idz and datz <= t.datpok order by datz desc) z;
6 фев 13, 21:33    [13887363]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
Lord_Nikon
Member

Откуда: Saint-Petersburg
Сообщений: 12
invm
SELECT  t.*, z.namez
FROM dbo.td t 
OUTER APPLY
 (SELECT TOP (1) namez FROM dbo.ztt1 
       WHERE idtt = t.idz 
           AND datz <= t.datpok 
   ORDER BY datz DESC) z;


invm, ОГРОМНОЕ ВАМ СПАСИБО!!!!!
Еще не встречался с Apply.. Век живи - век учись!
7 фев 13, 10:02    [13888692]     Ответить | Цитировать Сообщить модератору
 Re: Результатом запроса должна быть одна запись с датой, наибольшей из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Lord_Nikon
invm
SELECT  t.*, z.namez
FROM dbo.td t 
OUTER APPLY
 (SELECT TOP (1) namez FROM dbo.ztt1 
       WHERE idtt = t.idz 
           AND datz <= t.datpok 
   ORDER BY datz DESC) z;


invm, ОГРОМНОЕ ВАМ СПАСИБО!!!!!
Еще не встречался с Apply.. Век живи - век учись!
По моим наблюдениям APPLY - ещё тот тормоз.
Лучше пронумеруйте и выберите с первым номером
7 фев 13, 10:12    [13888752]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить