Разделение SQL

У меня есть данные таблицы Sql, и мне нужно фильтровать только блоки последовательных дат, как я выделил на изображении ниже.

введите здесь описание изображения.

и мне нужно добавить пользовательские ставки для каждой строки в выбранных блоках (эта ставка может отображаться в отдельном столбце на выходе). Если захвачено более 6 строк, то для каждого столбца этого блока применяется 200 долларов. 6, это будет 125 долларов. Результат должен быть таким: введите здесь описание изображения

И он должен группироваться по EmpID. мне нужно получить вывод с помощью MSSQL. Может кто-нибудь мне помочь

это то, что я сделал через представление sql

ALTER   view [dbo].[vw_Test2] AS

SELECT   
         tbl2.ID as Tbl2ID,
         tbl1.[EmpID],
         tbl1.[ExpInDateTime] as Tbl1ExpDate,
         tbl2.[ExpInDateTime] as Tbl2ExpDate,
            case when(CONVERT(date,tbl1.[ActInDateTime]) = CONVERT(date, DATEADD(DAY,1,tbl2.[ExpInDateTime]))) then
                 1
            else 0 
            end as Token
from [dbo].[vw_Test] tbl1 join [dbo].[vw_Test]  tbl2 
on tbl1.ID=(tbl2.ID+1) 
GO

единственное, что я должен сделать это, используя представления SQL


person CodeMind    schedule 10.02.2015    source источник
comment
Пожалуйста, дайте дополнительную информацию, например, желаемый результат при вводе, как показано!   -  person jarlh    schedule 10.02.2015
comment
Обратитесь к этой ссылке stackoverflow.com/questions/20402089 /   -  person DevelopmentIsMyPassion    schedule 10.02.2015
comment
Я сделал разбиение sql. Но я не могу получить требуемый результат.   -  person CodeMind    schedule 10.02.2015
comment
вы можете опубликовать то, что вы пробовали? Пожалуйста, опубликуйте скрипку sql, чтобы нам было легко   -  person DevelopmentIsMyPassion    schedule 10.02.2015
comment
ИЗМЕНИТЬ представление [dbo].[vw_Test2] AS SELECT tbl2.ID как Tbl2ID, tbl1.[EmpID], tbl1.[ExpInDateTime] как Tbl1ExpDate, tbl2.[ExpInDateTime] как Tbl2ExpDate, случай, когда (CONVERT(date,tbl1.[ActInDateTime) ]) = CONVERT(дата, DATEADD(DAY,1,tbl2.[ExpInDateTime]))) затем 1 иначе 0 заканчивается как токен из [dbo].[vw_Test] tbl1 присоединяется к [dbo].[vw_Test] tbl2 на tbl1.ID =(tbl2.ID+1) ПЕРЕЙТИ   -  person CodeMind    schedule 11.02.2015


Ответы (1)


Пожалуйста, попробуйте это как представление:

ALTER VIEW [dbo].[vw_Test2] AS
    WITH PreResult AS (
        SELECT p.Id,p.EmpID,p.[DateTime],CASE WHEN LEAD(p.diff)OVER(ORDER BY p.Id) > 1 OR LEAD(p.EmpID)OVER(ORDER BY p.Id)<>p.EmpID THEN 1 ELSE 0 END StartNewGroup
        FROM (
            SELECT t.Id,t.EmpID,t.[DateTime], COALESCE(DATEDIFF(day,LAG(t.[DateTime])OVER(PARTITION BY t.EmpID ORDER BY t.Id),t.[DateTime]),1) [diff]   
            FROM [dbo].[vw_Test] t
        ) p
    )
    SELECT r.Id,r.EmpID,r.[DateTime]
        ,CASE WHEN COUNT(*)OVER(PARTITION BY r.NewGroup ORDER BY r.NewGroup) >= 6 THEN 250 ELSE 125 END [Rate]
    FROM (
        SELECT b.Id,b.EmpID,b.[DateTime],1+COALESCE((SELECT SUM(a.StartNewGroup) FROM PreResult a WHERE a.Id<b.Id),0) NewGroup
        FROM PreResult b
    ) r
GO

Также есть запрос для игры:

CREATE TABLE #Test (Id BIGINT IDENTITY(1,1),EmpID BIGINT, [DateTime] DATETIME)

INSERT INTO #Test (EmpID,[DateTime]) VALUES (5,'20150106'),(5,'20150107'),(5,'20150109'),
    (5,'20150110'),(5,'20150126'),(5,'20150127'),
    (5,'20150128'),(5,'20150129'),(5,'20150130'),
    (5,'20150131'),(10,'20121203'),(10,'20121204'),
    (10,'20121205'),(10,'20121206'),
    (10,'20121207'),(10,'20121208'),(10,'20121209')

;WITH PreResult AS (
    SELECT p.Id,p.EmpID,p.[DateTime],CASE WHEN LEAD(p.diff)OVER(ORDER BY p.Id) > 1 OR LEAD(p.EmpID)OVER(ORDER BY p.Id)<>p.EmpID THEN 1 ELSE 0 END StartNewGroup
    FROM (
        SELECT t.Id,t.EmpID,t.[DateTime], COALESCE(DATEDIFF(day,LAG(t.[DateTime])OVER(PARTITION BY t.EmpID ORDER BY t.Id),t.[DateTime]),1) [diff]   
        FROM #Test t
    ) p
)
SELECT r.Id,r.EmpID,r.[DateTime]
    ,CASE WHEN COUNT(*)OVER(PARTITION BY r.NewGroup ORDER BY r.NewGroup) >= 6 THEN 250 ELSE 125 END [Rate]
FROM (
    SELECT b.Id,b.EmpID,b.[DateTime],1+COALESCE((SELECT SUM(a.StartNewGroup) FROM PreResult a WHERE a.Id<b.Id),0) NewGroup
    FROM PreResult b
) r

DROP TABLE #Test

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

person Vitaly Borisov    schedule 19.02.2015