powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вывести значение поля по минимальной дате с группировкой по другому полю
10 сообщений из 10, страница 1 из 1
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750456
lika01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Помогите, пжл, начинающему

есть результат запроса:
id num
1 0
2 1
3 1

Есть таблица
table2
id dt_open c_code
1 01.02.2007 432-654
1 11.12.2017 676-865
1 05.10.2018 454-456
2 01.02.2007 234-566
2 05.10.2018 852-543
3 05.10.2018 759-252
3 11.12.2017 686-876

К результату запроса необходимо вытащить значение поля c_code из table2 по минимальной дате, с группировкой по id, если поле num=1. Если num=0, то null.
т.е. должен быть результат:
id num c_code
1 0
2 1 234-566
3 1 686-876
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750488
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lika01,

Группировка второй таблицы с max датой
Потом джойните результат с первой выборкой по id
Потом определяетесь нужен ли вам null или 0 и делаете case соответственно.
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750496
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lika01,
как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH RESULTQUERY(ID,NUM)
AS
(
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
(
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)
SELECT R.ID,R.NUM,
CASE 
 WHEN R.NUM=0 THEN NULL 
 ELSE XQUERY.C_CODE
END AS FL 
 FROM RESULTQUERY R
 JOIN
 (
   SELECT T.ID,T.DT_OPEN,T.C_CODE
    FROM TABLE2 T
    JOIN
    (
      SELECT ID,MIN(DT_OPEN)MINDT
       FROM TABLE2
       GROUP BY ID
    )MINQ ON T.ID=MINQ.ID AND T.DT_OPEN=MINQ.MINDT
 )XQUERY ON R.ID=XQUERY.ID
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750540
lika01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
londinium, Спасибо.

В предложенном варианте решения идет перечисление значений таблицы, а у меня строк десятки тысяч (данные даны для наглядности). Как быть?
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750541
lika01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, спасибо

примерный план реализации в голове такой и был. Только синтаксис SQL мне еще не совсем подвластен (я только в самом начале пути), крутила этими функциями, но не получается, что-то видимо делаю не так.
Можете показать Ваш предложенный вариант на конкретном примере с построением самого запроса, очень буду благодарна))!
Уточню, что данных десятки тысяч строк (предоставленные мной данные, для примера).
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750542
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант londinium как раз реализация этого плана.
Почитайте про CTE - подзапросы, что бы понять синтаксис. По сути каждый СТЕ (который начинается с WITH... AS и запрос в скобочках), это отдельный подзапрос, коорый вынесен для наглядности и к результату которого вы обращаетесь в дальнейшем.

londiniumlika01,
как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH RESULTQUERY(ID,NUM)
AS
( -- тут ваш запрос, в котором вы получаете первую выборку
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
( -- тут просто выборка из вашей таблицы TABLE2 (select ... from TABLE2 c нужными вам условиями)
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)
SELECT R.ID,R.NUM,
CASE  -- 3. условие, если результирующей выборке NUM = 0, то NULL, иначе выбирается само значение C_CODE
 WHEN R.NUM=0 THEN NULL 
 ELSE XQUERY.C_CODE
END AS FL 
 FROM RESULTQUERY R
 JOIN -- 2. джойн первой выборки с результатом группировки
 (
   SELECT T.ID,T.DT_OPEN,T.C_CODE
    FROM TABLE2 T
    JOIN
    ( -- 1. группировка по ID с выборкой минимальной даты
      SELECT ID,MIN(DT_OPEN)MINDT
       FROM TABLE2
       GROUP BY ID
    )MINQ ON T.ID=MINQ.ID AND T.DT_OPEN=MINQ.MINDT
 )XQUERY ON R.ID=XQUERY.ID
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750544
lika01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,
Спасибо большое за разъяснения!
Извиняюсь, за свою не осведомленность в этой теме, обязательно почитаю)
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750565
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select distinct table1.id, 
                table1.num, 
                case when table1.num = 1 
                     then first_value(table2.c_code) over (partition by table2.id
                                                           order by table2.dt_open) 
                end c_code
from table1,table2
where table1.id = table2.id
order by 1
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750566
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как вывести значение поля по минимальной дате с группировкой по другому полю
    #39750692
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 WITH Table1(ID,NUM)
AS
( -- тут ваш запрос, в котором вы получаете первую выборку
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
( -- тут просто выборка из вашей таблицы TABLE2 (select ... from TABLE2 c нужными вам условиями)
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)

SELECT * FROM 
(
	SELECT table1.id, NULL AS c_code, table1.num 
	from table1
	where table1.num = 0 

	UNION ALL 

	SELECT TOP 1 WITH TIES table1.id, table2.c_code, table1.num 
	from table1, table2
	where table1.id = table2.id AND table1.num = 1 
	ORDER BY ROW_NUMBER() OVER (partition by table2.id order by table2.dt_open) 
) A
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вывести значение поля по минимальной дате с группировкой по другому полю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]