Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вывести значение поля по минимальной дате с группировкой по другому полю / 10 сообщений из 10, страница 1 из 1
19.12.2018, 20:15
    #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
19.12.2018, 21:27
    #39750488
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести значение поля по минимальной дате с группировкой по другому полю
lika01,

Группировка второй таблицы с max датой
Потом джойните результат с первой выборкой по id
Потом определяетесь нужен ли вам null или 0 и делаете case соответственно.
...
Рейтинг: 0 / 0
19.12.2018, 21:41
    #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
20.12.2018, 05:11
    #39750540
lika01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести значение поля по минимальной дате с группировкой по другому полю
londinium, Спасибо.

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

примерный план реализации в голове такой и был. Только синтаксис SQL мне еще не совсем подвластен (я только в самом начале пути), крутила этими функциями, но не получается, что-то видимо делаю не так.
Можете показать Ваш предложенный вариант на конкретном примере с построением самого запроса, очень буду благодарна))!
Уточню, что данных десятки тысяч строк (предоставленные мной данные, для примера).
...
Рейтинг: 0 / 0
20.12.2018, 06:05
    #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
20.12.2018, 06:18
    #39750544
lika01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести значение поля по минимальной дате с группировкой по другому полю
PizzaPizza,
Спасибо большое за разъяснения!
Извиняюсь, за свою не осведомленность в этой теме, обязательно почитаю)
...
Рейтинг: 0 / 0
20.12.2018, 07:50
    #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
20.12.2018, 07:51
    #39750566
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести значение поля по минимальной дате с группировкой по другому полю
...
Рейтинг: 0 / 0
20.12.2018, 12:05
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вывести значение поля по минимальной дате с группировкой по другому полю / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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