Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как отфильтровать выборку по максимальной дате и значению?  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1078
Выборка
select ID, DateIn, Val from Tab1

даёт следующее:
ID  DateIn       Val

1   01.10.2015   100
1   02.10.2015   200
1   03.10.2015   300
1   03.10.2015   400
2   01.10.2015   110
2   02.10.2015   220
2   02.10.2015   330
2   03.10.2015   440

Как модифицировать этот запрос, чтобы получить из его выборки следующее:
ID  DateIn       Val

1   03.10.2015   400
2   03.10.2015   440
21 окт 15, 15:28    [18308006]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
все поля включить в группировку
21 окт 15, 15:29    [18308015]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
правильный проходящий.
Guest
verter
Выборка
select ID, DateIn, Val from Tab1

даёт следующее:
ID  DateIn       Val

1   01.10.2015   100
1   02.10.2015   200
1   03.10.2015   300
1   03.10.2015   400
2   01.10.2015   110
2   02.10.2015   220
2   02.10.2015   330
2   03.10.2015   440

Как модифицировать этот запрос, чтобы получить из его выборки следующее:
ID  DateIn       Val

1   03.10.2015   400
2   03.10.2015   440
А логику выбора именно этих строк надо придумать или отгадать?
21 окт 15, 15:30    [18308019]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
verter
Как отфильтровать выборку по максимальной дате и значению?
Имеется в виду - значение на максимальную дату? ну так WHERE ROW_NUMBER() OVER (PARTITION BY id ORDER BY datein DESC) = 1 (само собой в подзапросе).
21 окт 15, 15:33    [18308038]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Akina
verter
Как отфильтровать выборку по максимальной дате и значению?
Имеется в виду - значение на максимальную дату? ну так WHERE ROW_NUMBER() OVER (PARTITION BY id ORDER BY datein DESC) = 1 (само собой в подзапросе).
Насколько я понял, для одной и той же даты максимальное значение.
Значит и его в ORDER BY через запятую.
21 окт 15, 15:35    [18308050]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
--set language russian;
declare @t table(
ID int, DateIn date,       Val int);
insert into @t
values 
(1,   '01.10.2015',   100),
(1,   '02.10.2015',   200),
(1,   '03.10.2015',   300),
(1,   '03.10.2015',   400),
(2,   '01.10.2015',   110),
(2,   '02.10.2015',   220),
(2,   '02.10.2015',   330),
(2,   '03.10.2015',   440)

select top 1 with ties *
from @t
order by ROW_NUMBER() over(partition by id order by datein desc, val desc);
---
ID	DateIn	Val
1	2015-10-03	400
2	2015-10-03	440

?
21 окт 15, 15:39    [18308064]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
declare @t table(
ID int, DateIn date,       Val int);
insert into @t
values 
(1,   '01.10.2015',   100),
(1,   '02.10.2015',   200),
(1,   '03.10.2015',   300),
(1,   '03.10.2015',   400),
(2,   '01.10.2015',   110),
(2,   '02.10.2015',   220),
(2,   '02.10.2015',   330),
(2,   '03.10.2015',   440)

select a.ID, MAX(a.DateIn) as [date], max(a.Val) as [value] from @t a group by a.ID
21 окт 15, 15:42    [18308083]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1078
Akina
verter
Как отфильтровать выборку по максимальной дате и значению?
Имеется в виду - значение на максимальную дату? ну так WHERE ROW_NUMBER() OVER (PARTITION BY id ORDER BY datein DESC) = 1 (само собой в подзапросе).

Нужно максимальное значение на максимальную дату. Т.е. по каждому ID нужно выбрать сначала все строчки с максимальной датой, а потом из них выбрать одну строчку с максимальным значением.
21 окт 15, 15:42    [18308084]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
Konst_One
declare @t table(
ID int, DateIn date,       Val int);
insert into @t
values 
(1,   '01.10.2015',   100),
(1,   '02.10.2015',   200),
(1,   '03.10.2015',   300),
(1,   '03.10.2015',   400),
(2,   '01.10.2015',   110),
(2,   '02.10.2015',   220),
(2,   '02.10.2015',   330),
(2,   '03.10.2015',   440)

select a.ID, MAX(a.DateIn) as [date], max(a.Val) as [value] from @t a group by a.ID

не катит, т.к. могут *в разных строках* быть макс. по дате и макс. по значению.
вот так:
declare @t table(
ID int, DateIn date,       Val int);
insert into @t
values 
(1,   '01.10.2015',   1000),
(1,   '02.10.2015',   200),
(1,   '03.10.2015',   300),
(1,   '03.10.2015',   400),
(2,   '01.10.2015',   110),
(2,   '02.10.2015',   220),
(2,   '02.10.2015',   330),
(2,   '03.10.2015',   440)

select a.ID, MAX(a.DateIn) as [date], max(a.Val) as [value] from @t a group by a.ID
---
1	2015-10-03	1000
2	2015-10-03	440
21 окт 15, 15:49    [18308118]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
verter
по каждому ID нужно выбрать сначала все строчки с максимальной датой, а потом из них выбрать одну строчку с максимальным значением.
Ну, как с(по)казано выше, добавить ещё один уровень сортировки.
21 окт 15, 15:54    [18308139]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
o-o
не катит, т.к. могут *в разных строках* быть макс. по дате и макс. по значению.
вот так:
Ерунда. Сперва - максимальная дата. И только для неё - максимальное значение. Всё, что "вчера" - мимо кассы.
21 окт 15, 15:55    [18308143]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
я думаю, что ТС сам решит, сто ему использоавть, но вот хрустальный шар мне намекает, что не будет на его версии сервера работать with ties и прочие прибамбасы patition by =)
21 окт 15, 15:55    [18308145]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Konst_One
я думаю, что ТС сам решит, сто ему использоавть, но вот хрустальный шар мне намекает, что не будет на его версии сервера работать with ties и прочие прибамбасы patition by =)
WITH TIES работает на ВСЕХ (!!!) версиях
21 окт 15, 16:00    [18308178]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
А зачем на поставленной задаче WITH TIES? Мне, например, хрустальный шар намекает, что ТС-у глубоко воскласть на количество дубликатов, тем более что на описанной структуре они вообще неразличимы.
21 окт 15, 16:01    [18308186]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
iap
WITH TIES работает на ВСЕХ (!!!) версиях


я про сочетание с partition by говорю
21 окт 15, 16:02    [18308191]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
Akina
o-o
не катит, т.к. могут *в разных строках* быть макс. по дате и макс. по значению.
вот так:
Ерунда. Сперва - максимальная дата. И только для неё - максимальное значение. Всё, что "вчера" - мимо кассы.

ну и?
для ид = 1 макс дата 03.10.2015 .
и где для нее макс. значение?
я вижу, вывелось 1000 от 01.10.2015
---
сам кассир
21 окт 15, 16:02    [18308198]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
Konst_One
iap
WITH TIES работает на ВСЕХ (!!!) версиях

я про сочетание с partition by говорю

оно с 2005,
а вертер, блин, он из 2084 года.
классику надо знать
21 окт 15, 16:04    [18308212]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Konst_One
iap
WITH TIES работает на ВСЕХ (!!!) версиях


я про сочетание с partition by говорю
Нет такого сочетания. TOP()WITH TIES ORDER BY и OVER() - независимые конструкции.
OVER() - с MSSQL2005
21 окт 15, 16:13    [18308272]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
и что ? в одном запросе , значит в сочетании или вы о чём? я лишь о применении в конкретной ситуации.


ТС, вот без всяких мудрённых выражений:

declare @t table(
ID int, DateIn date,       Val int);
insert into @t
values 
(1,   '20151001',   1000),
(1,   '20151001',   100),
(1,   '20151002',   200),
(1,   '20151003',   300),
(1,   '20151003',   400),
(1,   '20151004',   10),
(2,   '20151001',   110),
(2,   '20151002',   220),
(2,   '20151002',   330),
(2,   '20151003',   440)

select 
	M.ID,
	M.date,
	MAX(B.Val) as [value]
from @t B INNER JOIN (select a.ID as ID, MAX(a.DateIn) as [date] from @t a group by a.ID) M
			ON B.ID = M.ID AND B.DateIn = M.date
GROUP BY
	M.ID, M.date
21 окт 15, 16:19    [18308308]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
Konst_One
и что ? в одном запросе , значит в сочетании или вы о чём? я лишь о применении в конкретной ситуации.

если это мне, то я всегда кроме обращения к конкретной личности
еще и цитирую то, на что отвечаю.
ваш тот первый вариант кода дает неверный ответ на тестовых данных с 1000 в первой строке.
и не вижу логики вот здесь: "в одном запросе , значит в сочетании"
вам трудно запустить на выполнение вами же написанное с теми моими данными и убедиться?
да мне все равно вообще-то, не хотите, останьтесь при своем мнении.
с незаинтересованными дискутировать неинтересно :)
21 окт 15, 16:40    [18308406]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
o-o
если это мне


нет чтов вы, это я на это сообщение 18308272
21 окт 15, 16:42    [18308413]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
Konst_One
o-o
если это мне

нет чтов вы, это я на это сообщение 18308272

ну...воообще-то эти тоже независимые.
топ топом (2000-ый понимает),
а over(partition by id order by datein desc, val desc) там к row_number-у, а он и правда с 2005-ого.

т.е. топ конечно order by row_number,
но все равно over() не его :)
21 окт 15, 16:50    [18308453]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
никто и не спорит про "независимость". я вообще не понимаю, что прицепились то к этому. я совсем про другое писал, там нет нигде такого слова =)
21 окт 15, 16:52    [18308466]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
o-o
Guest
??? Konst_One ???
хрустальный шар мне намекает, что не будет на его версии сервера работать with ties и прочие прибамбасы patition by =)
...
в одном запросе , значит в сочетании

Konst_One,
меня запутали
короче, с 2005-ого начиная мой вариант прокатит,
за производительность не ручаюсь.
но если у ТС 2000 (у вас тоже?)
то WELCOME TO CLUB!
21 окт 15, 17:07    [18308533]     Ответить | Цитировать Сообщить модератору
 Re: Как отфильтровать выборку по максимальной дате и значению?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
o-o
WELCOME TO CLUB!


=)
есть и 2005, избавляемся потихоньку
21 окт 15, 17:10    [18308550]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить