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

Откуда: Киев
Сообщений: 35
Есть таблица с результатами звонков клиентам. Условно (ID INT, DATE_ACTION DATETIME, PhoneNumber INTEGER, ACTION_RESULT NVARCHAR(100))

Как вернуть только те ID где было три попытки набора в три разных дня?
Заранее спасибо!
28 дек 17, 11:45    [21069304]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Добрый Э - Эх
Guest
Patucho,

а почему row_number? а не COUNT() ?
28 дек 17, 11:47    [21069314]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Добрый Э - Эх
Guest
Patucho,

а почему row_number? а не COUNT() ?
28 дек 17, 11:47    [21069316]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Я подумал, что это нужно делать с помощью ROW_NUMBER. Но рассмотрю все варианты)
28 дек 17, 11:50    [21069337]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Добрый Э - Эх
Guest
Patucho,

привет данных приведи, и результат на них... чтобы было на чем решения показывать...
28 дек 17, 11:51    [21069347]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Patucho,

приветмер данных приведи, и результат на них... чтобы было на чем решения показывать...
28 дек 17, 11:52    [21069355]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Добрый Э - Эх
Patucho,
а почему row_number? а не COUNT() ?

Потому что COUNT DISTINCT :)
WITH
t0 ( [id], [date] ) AS (
  SELECT 1, CONVERT( DATETIME, '2017-12-01T09:00:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-01T09:10:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-01T09:30:00' ) UNION ALL
  SELECT 1, CONVERT( DATETIME, '2017-12-02T09:00:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-02T09:10:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-02T09:30:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-03T09:10:00' ) UNION ALL
  SELECT 2, CONVERT( DATETIME, '2017-12-03T09:30:00' )
)
SELECT
  [id]
FROM
  t0
GROUP BY
  [id]
HAVING
  COUNT( DISTINCT CONVERT( DATE, [date] ) ) >= 3
28 дек 17, 11:54    [21069366]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Добрый Э - Эх,

SELECT TOP 20
ID
,LID 'Кому звонили'
,Created 'Дата действия'
,TypeID 'Результат'
FROM dbo.history
28 дек 17, 11:59    [21069391]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Patucho
Есть таблица с результатами звонков клиентам. Условно (ID INT, DATE_ACTION DATETIME, PhoneNumber INTEGER, ACTION_RESULT NVARCHAR(100))
это ID уникально в таблице?
может ли быть несколько записей по одному PhoneNumber в один день?
28 дек 17, 12:00    [21069397]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Дедушка,

ID - инкремент
может быть несколько записей по одному PhoneNumber в один день

Но нужно три записи в три разных дня
28 дек 17, 12:02    [21069404]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Дедушка,

я пробую вот так:

SELECT h.ID,h.LID, CAST(h.Created AS DATE)
,ROW_NUMBER() OVER (PARTITION BY h.LID, CAST(h.Created AS DATE) ORDER BY h.LID)
FROM dbo.history h (NOLOCK)
WHERE h.Created > GETDATE()-4

но, оно так нумерует те, по которым было действие в один день
28 дек 17, 12:14    [21069457]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Patucho
Как вернуть только те ID где было три попытки набора в три разных дня?
если ID уникально, то какие именно ID вы хотите получить:
- все ID для этого PhoneNumber по которому было 3 попытки или?
- ID конкретно этих "третьих" попыток?

вдогонку, именно 3 попытки или 3 и более?
28 дек 17, 12:16    [21069463]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Дедушка,

Прошу прощения, неправильно поставил вопрос. Нужны все LID по которым было попыток набора >= 3 в три разных дня
28 дек 17, 12:20    [21069475]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
21069366
28 дек 17, 12:28    [21069510]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
Руслан Дамирович, если честно, я не понимаю Ваш запрос
28 дек 17, 12:35    [21069536]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Patucho
Дедушка,

ID - инкремент
может быть несколько записей по одному PhoneNumber в один день

Но нужно три записи в три разных дня
Всего три звонка по одному номеру или три звонка в разные дни и, возможно, ещё какие-то звонки в какие-то дни?
28 дек 17, 12:46    [21069586]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
iap,

есть столбец "LID" (кому звонили), нужно три попытки набора на один LID в три разных дня. На любой номер
28 дек 17, 13:00    [21069641]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Patucho
iap,

есть столбец "LID" (кому звонили), нужно три попытки набора на один LID в три разных дня. На любой номер
SELECT * FROM T WHERE T.LID IN
(SELECT TT.LID FROM T TT GROUP BY TT.LID HAVING COUNT(DISTINCT CAST(TT.Created AS DATE))>=3)
28 дек 17, 13:42    [21069732]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
iap
Patucho
iap,

есть столбец "LID" (кому звонили), нужно три попытки набора на один LID в три разных дня. На любой номер
SELECT * FROM T WHERE T.LID IN
(SELECT TT.LID FROM T TT GROUP BY TT.LID HAVING COUNT(DISTINCT CAST(TT.Created AS DATE))>=3)
А вообще-то, это уже писали выше: 21069366
Разве что тут выводятся все поля, а не только LID
28 дек 17, 13:44    [21069738]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Patucho
Member

Откуда: Киев
Сообщений: 35
iap,

Я уже сделал.
IF OBJECT_ID(N'tempdb..#1') IS NOT NULL DROP TABLE #1 
SELECT DISTINCT l.ID, CAST(h.Created AS DATE) 'Created'
INTO #1
FROM dbo.loans l (NOLOCK)
LEFT JOIN dbo.history h (NOLOCK) ON h.LID = l.ID
WHERE h.Created >= dbo.FirstMD(GETDATE())
AND l.PID IN (325,326,331,340,341,349,359)

IF OBJECT_ID(N'tempdb..#2') IS NOT NULL DROP TABLE #2
SELECT a.ID LID
		,a.Created
		,ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.Created) row
INTO #2
FROM #1 a
GROUP BY a.ID, a.Created

IF OBJECT_ID(N'tempdb..#action') IS NOT NULL DROP TABLE #action
SELECT DISTINCT s.LID
INTO #action
FROM #2 s 
WHERE s.row >= 3
28 дек 17, 14:08    [21069826]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
IF OBJECT_ID(N'tempdb..#1') IS NOT NULL DROP TABLE #1

как это в многопользовательской среде отработает?
28 дек 17, 15:14    [21070037]     Ответить | Цитировать Сообщить модератору
 Re: ROW NUMBER  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
waszkiewicz
IF OBJECT_ID(N'tempdb..#1') IS NOT NULL DROP TABLE #1
как это в многопользовательской среде отработает?

Нормально отработает. Это сессионные времянки.
28 дек 17, 15:24    [21070066]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить