簡體   English   中英

在 ROW_NUMBER() 和 PARTITION BY | 中讀取 0.5 值 SQL 服務器 2012

[英]Reading 0.5 value in ROW_NUMBER() and PARTITION BY | SQL Server 2012

我在Looping between 2 case parameters (Date Range and Row Count) |之前有這個問題 SQL Server 2012 ,現在我在想一個場景,如果這個值有一個0.5呢? 或.5? 這會使用ROW_NUMBER()嗎?

我正在嘗試僅使用CASE方法來完成這項工作。

這是我的舊腳本:

DECLARE @dbApple TABLE
                 (
                     FromDate varchar(30) NOT NULL,
                     ToDate varchar(30) NOT NULL,
                     Name varchar(30) NOT NULL,
                     Count float(30) NOT NULL
                 )

INSERT INTO @dbApple (FromDate, ToDate, Name, Count) 
VALUES ('2019-10-05', '2019-10-09', 'APPLE', '2.5');

(SELECT
    CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) AS Date,
    DB.Name,
    CASE 
       WHEN CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) BETWEEN CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) AND CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, ToDate)))
          THEN 
             CASE 
                WHEN ROW_NUMBER() OVER (PARTITION BY Count, FromDate, ToDate ORDER BY Count) <= Count
                   THEN (COUNT / COUNT) 
             END 
    END AS Count
FROM 
    @dbApple DB
JOIN 
    MASTER..SPT_VALUES VAL ON VAL.TYPE = 'P'
                           AND VAL.NUMBER BETWEEN 0 AND DATEDIFF(D, FromDate, ToDate))

這是 output:

在此處輸入圖像描述

這是我預期的 output:

在此處輸入圖像描述

有沒有辦法讓它起作用? 謝謝你。

您可以通過注意VAL.NUMBER已經是您的行號(只是從 0 而不是 1 開始)來大大簡化您的查詢。 然后您可以將Count數值與VAL.NUMBER進行比較,如果Count - VAL.NUMBER大於 1,則 output 1; 如果它大於 0 output 差值,否則為 output NULL 對於這個演示查詢,我使用表值構造函數模擬了您的數字表:

declare @dbApple TABLE(
    FromDate varchar(30) NOT NULL,
    ToDate varchar(30) NOT NULL,
    Name varchar(30) NOT NULL,
    Count float(30) NOT NULL
)

INSERT INTO @dbApple
(FromDate,ToDate,Name,Count) VALUES ('2019-10-05','2019-10-09','APPLE',2.5);

SELECT
    CONVERT(date,CONVERT(date,DATEADD(D,VAL.NUMBER,FromDate))) AS Date,
    Name,
    CASE WHEN Count - VAL.NUMBER > 1 THEN 1
         WHEN Count - VAL.NUMBER > 0 THEN Count - VAL.NUMBER
    END AS Count
FROM 
    @dbApple D
JOIN (VALUES (0), (1), (2), (3), (4), (5)) VAL(NUMBER)
  ON VAL.NUMBER BETWEEN 0 AND DATEDIFF(D, FromDate, ToDate)

Output:

Date        Name    Count
2019-10-05  APPLE   1
2019-10-06  APPLE   1
2019-10-07  APPLE   0.5
2019-10-08  APPLE   (null)
2019-10-09  APPLE   (null)

dbfiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM