Member 13818387 Ответов: 2

Присоединяйтесь к трем таблицам только с максимальной датой


Привет
Пожалуйста помочь
Я не могу сделать это сама.
У меня есть три стола:
Towary, Kontrahenci и TwrIlosci

Таблица TWrIlosci связана с первой через id и содержит записи с разными датами.
Я бы хотел отобразить только записи за последнюю дату

У меня есть этот запрос, но он показывает все записи

Sorry for that I forgot to paste data

<pre>
Table Towary
twr_kod			twr_nazwa	twr_numerkat	twr_koddostawcy		twr_iloscmin
MECCZ-TK7598/A	PAL												0.0000
MECCZ-TK7605	NAPY											0.0000
MECCZ-TK7722	KOLO 1											0.0000
MECCZ-TK7723	KOLO 2											0.0000
MECCZ-TK7741	ZEST											0.0000

Table Kontrahenci
knt_kod			knt_kntid
!NIEOKREŚLONY!	1
00000			1853
10-05-1039		2239
10-05-1052		2253
10-05-1090		2309


Table TwrIlosci 
twi_ilosc	twi_rezerwacje		twi_zamowienia		twi_data					TwI_TwrId
0.0000		0.0000				0.0000				2011-05-05 00:00:00.000		57
1.0000		0.0000				0.0000				2011-04-30 00:00:00.000		57
0.0000		0.0000				0.0000				2011-05-05 00:00:00.000		57
1.0000		0.0000				0.0000				2011-04-30 00:00:00.000		57
0.0000		0.0000				0.0000				2017-06-20 00:00:00.000		132


Пример ответа на мой запрос
twr_kod	twr_nazwa	twr_numerkat	twr_koddostawcy	knt_kod	twr_iloscmin	twi_ilosc	twi_rezerwacje	twi_zamowienia	twi_data
MSP321528-0-00	ZTYLNIE			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSP321528-0-00	ZTYLNIE			6-10-11-MSP	0.0000	1.0000	0.0000	0.0000	2011-04-30 00:00:00.000
MSP321528-0-00	ZTYLNIE			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSP321528-0-00	ZTYLNIE			6-10-11-MSP	0.0000	1.0000	0.0000	0.0000	2011-04-30 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2017-06-20 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2012-05-22 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	10.0000	0.0000	0.0000	2012-05-17 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2017-06-20 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2012-05-22 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	10.0000	0.0000	0.0000	2012-05-17 00:00:00.000
MSPRM101572-012	CHWYTACZ C			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2015-05-07 00:00:00.000
MSPRM101572-012	CHWYTACZ C			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2015-05-07 00:00:00.000
MSPRM202092-0-1	CHWYTACZ G			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSPRM202092-0-1	CHWYTACZ G			6-10-11-MSP	0.0000	1.0000	0.0000	0.0000	2011-04-30 00:00:00.000
MSPRM202092-0-1	CHWYTACZ G			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSPRM202092-0-1	CHWYTACZ G			6-10-11-MSP	0.0000	1.0000	0.0000	0.0000	2011-04-30 00:00:00.000
MSPRM202095-013	N DOLNY			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2016-10-17 00:00:00.000
MSPRM202095-013	N DOLNY			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2015-10-19 00:00:00.000
MSPRM202095-013	N DOLNY			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2016-10-17 00:00:00.000
MSPRM202095-013	N DOLNY			6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2015-10-19 00:00:00.000


Я хотел бы иметь только:
twr_kod	twr_nazwa	twr_numerkat	twr_koddostawcy	knt_kod	twr_iloscmin	twi_ilosc	twi_rezerwacje	twi_zamowienia	twi_data
MSP321528-0-00	ZTYLNIE	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSPRM100458-010	SRUBA	SCREW	RM100458-0-10	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2017-06-20 00:00:00.000
MSPRM101572-012	CHWYTACZ C	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2015-05-07 00:00:00.000
MSPRM202092-0-1	CHWYTACZ G	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2011-05-05 00:00:00.000
MSPRM202095-013	N DOLNY	6-10-11-MSP	0.0000	0.0000	0.0000	0.0000	2016-10-17 00:00:00.000


Что я уже пробовал:

SELECT
twr_kod, twr_nazwa, twr_numerkat, twr_koddostawcy, knt_kod, twr_iloscmin, twi_ilosc, twi_rezerwacje, twi_zamowienia, twi_data
FROM ((XL.Towary
INNER JOIN XL.Kontrahenci ON XL.Towary.twr_kntid = XL.Kontrahenci.knt_kntid)
INNER JOIN 
XL.TwrIlosci ON XL.TOWARY.Twr_TwrId = XL.TwrIlosci.TwI_TwrId)

Maciej Los

Примеры данных могут помочь решить вашу проблему.
В данный момент требование объединять таблицы только по максимальной дате неясно, особенно когда нет поля даты...

Jörgen Andersson

Используйте "улучшить вопрос" вместо публикации нового решения

Maciej Los

Кажется, это MS Access... Разве я не прав?

Member 13818387

Спасибо за помощь
Я изменил вопрос. База данных-MS SQL

Maciej Los

Всегда пожалуйста. Пожалуйста, в следующий раз используйте виджет "ответить", если вы хотите сообщить мне о своем ответе.
Теперь ваш вопрос немного более понятен, но есть еще несколько вопросов...
Делает twi_data есть ли поле, по которому вы хотите фильтровать данные? Что вы имеете в виду, говоря: "я хотел бы отобразить только записи за последнюю дату"? Пожалуйста, предоставьте более подробную информацию...

Member 13818387

Да, twi_data-это поле для фильтрации данных.
Я хотел бы получить twr_kod с последней датой из поля twi_data в ответ.
Я добавлю в код вопроса, что я получаю и что я хотел бы получить.

2 Ответов

Рейтинг:
2

Maciej Los

Кажется, что вам нужно использовать MAX() OVER()[^]:

SELECT DISTINCT twr_kod, twr_nazwa, twr_numerkat, twr_koddostawcy, knt_kod, twr_iloscmin, twi_ilosc, twi_rezerwacje, twi_zamowienia, twi_data
FROM (
    SELECT TwrI_TwrId, twi_ilosc, twi_rezerwacje, twi_zamowienia, MAX(twi_data) OVER(PARTITION BY TwI_TwrId ORDER BY twi_data DESC) AS twi_data
    FROM XL.TwrIlosci
) AS TWI
    INNER JOIN XL.TOWARY AS TWR ON TWR.Twr_TwrId = TWI.TwI_TwrId
    INNER JOIN XL.Kontrahenci AS K ON TWR.twr_kntid = K.knt_kntid


Member 13818387

Спасибо
Я проверю его дома.
Но, пожалуйста, отредактируйте свой запрос.
Там нет столбца TwrI_TwrId (второй выбор)
Я думаю, что это должно быть Twi_TwrId

Maciej Los

Хммм... Есть еще один TwrI_TwrId поле в начале второго SELECT заявление.

Member 13818387

Да это есть в заявлении но в таблице TwrIlosci такого столбца нет

Maciej Los

ОК. Измените вышеуказанный запрос по мере необходимости... ;)

Member 13818387

Можно ли преобразовать этот запрос так, чтобы он работал на MS SQL 2008 R2 у меня есть ошибка и я прочитал, что предложение OVER не поддерживает ORDER BY для агрегатных функций в SQL2008R2 (только для ранжирования)

Maciej Los

Странный... Как говорится в документации MSDN, предложение OVER поддерживается начиная с SQL Server 2008.

Это возможно, но немного сложнее. Вам нужно заменить второй оператор SELECT:

SELECT TwrI_TwrId, twi_ilosc, twi_rezerwacje, twi_zamowienia, MAX(twi_data) OVER(PARTITION BY TwI_TwrId ORDER BY twi_data DESC) AS twi_data
    FROM XL.TwrIlosci

с чем-то вроде этого:
SELECT TwrI_TwrId, MAX(twi_data) AS twi_data 
    FROM XL.TwrIlosci
    GROUP BY TwrI_TwrId) AS A
    RIGHT JOIN XL.TwrIlosci AS B ON A.TwrI_TwrId = B.TwrI_TwrId AND A.twi_data = B.twi_data

Member 13818387

Она должна работать на обоих 2008 по 2017 год?
Я проверил только на 2017 год, но у меня есть синтаксическая ошибка.

Maciej Los

На SQL-сервере 2017? О нет!
Дайте мне немного времени, и я улучшу свой ответ на основе ваших выборочных данных.

[РЕДАКТИРОВАТЬ]
Прости, моя беда!
Мое первое утверждение было неверным, потому что оно возвращает максимальную дату для каждого изменения, что неверно. Используйте второе утверждение.

Member 13818387

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

SELECT DISTINCT twr_kod, twr_nazwa, twr_numerkat, twr_koddostawcy, knt_kod, twr_iloscmin, twi_ilosc, twi_rezerwacje, twi_zamowienia, twi_dataFROM (    SELECT TwrI_TwrId, MAX(twi_data) AS twi_data     FROM XL.TwrIlosci    GROUP BY TwrI_TwrId) AS A    RIGHT JOIN XL.TwrIlosci AS B ON A.TwrI_TwrId = B.TwrI_TwrId AND A.twi_data = B.twi_data) AS TWI    INNER JOIN XL.TOWARY AS TWR ON TWR.Twr_TwrId = TWI.TwI_TwrId    INNER JOIN XL.Kontrahenci AS K ON TWR.twr_kntid = K.knt_kntid

В конце есть еще одна скобка

Рейтинг:
2

OriginalGriff

Попробуй:

SELECT TOP 1 ... ORDER BY MyDateColumn DESC
где ваш запрос вписывается в многоточие.