【问题标题】:Group value via range and value sql query通过范围和值 sql 查询对值进行分组
【发布时间】:2018-01-03 18:01:55
【问题描述】:

我有两张桌子。 Table1 有以下字段。

From    To      id
----    ----     ----
  0      0        1
  1      5        2
  5      10       3
  10     15       4 

表 2:

Table 1 ID    Value
---------     -------
1              10
2              10
3              15
4              10

当前输出:

from      To     Value
-----  ------   -------
0         15      10
5         10      15

需要的输出

From     To     Value
------   ----   ------ 
0         5      10
5         10     15
10        15     10

如何获得输出

代码

SELECT  MIN(DiscountFrom) FromDiscount ,
    MAX(DiscountTo) Todiscount ,
    Amount
FROM    table1 t1
    JOIN table2  t2 ON t1.id =  t2.id
GROUP BY Amount

【问题讨论】:

  • 你的代码在哪里?
  • 我被你的数据弄糊涂了,有时上一条记录的to值与下一条记录的from值匹配,但第一条和第二条记录不会发生这种情况,请澄清

标签: sql-server sorting filter grouping


【解决方案1】:

这里对我来说分组没有意义,所以我使用lead() 函数来访问下一条记录,如果找到 0

select distinct 
       case when t.[from] = 1 then 0 else t.[from] end [from],  
       case when t.[to] = 0 then lead(t.[to]) over (order by t.id) else t.[to] end [to], 
       t1.value 
from table1 t
join table2 t1 on t1.id = t.id

结果:

from    to  value
0       5   10
5      10   15
10     15   10

【讨论】:

  • 这不适用于所有情况,例如如果连续有3个相似的值,并且依赖于键顺序,
  • @RegBes 以上是根据当前场景或提供的数据发布的。
【解决方案2】:

您的数据似乎不一致,为此我必须将第一条记录更改为

From    To      id
----    ----     ----
  0      1        1 

那么这适用于所有情况

;WITH test1
     AS (SELECT
           t.id
           ,[from]
           ,[to]
           ,value
         FROM
           table1 t
           JOIN table2 t1
             ON t1.id = t.id),
     MyTest
     AS (SELECT
           Anchor.[from]
           ,Anchor.[To]
           ,Anchor.value
           ,1 AS Grp
         FROM
           test1 AS Anchor
         WHERE
           [From] = 0
         UNION ALL
         SELECT
           Child.[from]
           ,Child.[To]
           ,Child.value
           ,CASE WHEN Mytest.value = child.value THEN 0 ELSE 1 END + MyTest.Grp AS grp
         FROM
           test1 AS Child
           INNER JOIN MyTest
                   ON Mytest.[To] = child.[From])
SELECT
  Min([From]) AS [From]
  ,Max([To])  AS [To]
  ,Max(Value) AS Value
FROM
  mytest
GROUP  BY
  Grp 

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2016-02-27
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多