2016-12-23 77 views
-1

我有一个非常大的SQL数据库,我正在拉数据到网页。我不想拉扯每一个价值,而是想要获得每第12个价值。有没有办法修改我当前的select语句?如何获取SQL select语句中的第12个值?

SELECT * 
    FROM (
     SELECT CAST(DateTimeUTC as SmallDateTime) as [DateTime], 
     CASE When DataValue = '-9999' Then null 
      When DataValue < '-60' Then null 
      Else DataValue 
      End DataValue, VariableID 
     FROM DataValues 
     WHERE SiteID = @siteID and VariableID IN(9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) 
     ) TableDate 
    PIVOT (SUM(DataValue) FOR VariableID IN ([9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30])) PivotTable ORDER BY [DateTime] 

END

此作品不同的是数据交错从一列到下一个。我不确定为什么所有的数据点都不在相同的位置开始。

看到下面的屏幕截图。

= enter image description here

+5

这是MS SQL Server的?请添加您使用的数据库的标签,因为解决方案因数据库而异。 – Bohemian

+2

另外,按照什么标准(如果有)命令第12条? – Bohemian

+2

为什么你将数字存储(或比较)为字符串?如果'DataValue'是一个数字,你应该将它与一个数字进行比较。 ''-999'是一个字符串值,不是数字 –

回答

1

用这一理论(SQL服务器) -

with rNum As(
    SELECT t.*,RowNum = row_number() over (order by date) 
    FROM testdb.dbo.testtable t 
    ) 
    select * from rNum where (RowNum % 12) = 0 

事情是这样的 -

with dVal As(
Select RowNum = row_number() over (order by datetime),DataValues.* 
from datavalues) 

SELECT * 
    FROM (
     SELECT CAST(DateTimeUTC as SmallDateTime) as [DateTime], 
     CASE When DataValue = '-9999' Then null 
      When DataValue < '-60' Then null 
      Else DataValue 
      End DataValue, VariableID 
     FROM dVal 
     WHERE 
     /* divide by 12 has no remainder */ 
     (RowNum % 12) = 0 and 

     SiteID = @siteID and VariableID IN(9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30) 
     ) TableDate 
    PIVOT (SUM(DataValue) FOR VariableID IN ([9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30])) PivotTable ORDER BY [DateTime] 
1

,或者

Select * from DataValues d 
where (Select count(*) from datavalues 
     where DateTimeUTC < d.DateTimeUTC) % 12 = 0 

开始在第12行,而不是第一排,

Select * from DataValues d 
where (Select count(*) from datavalues 
     where DateTimeUTC <= d.DateTimeUTC) % 12 = 0 

Select * from DataValues d 
where (Select count(*) from datavalues 
     where DateTimeUTC < d.DateTimeUTC) % 12 = 11 
+0

这也很漂亮..但是这实际上是从“行号”1开始的,所以它实际上是行号1,13,25等...... – pizzaslice

+0

不错的工作查尔斯 – pizzaslice

+1

这是我们曾经使用的旧技术用于排名或生成行号之前有'排名' –