获取最新记录,如果最近的记录不符合以前的记录

时间:2017-04-27 14:23:35

标签: sql sql-server

我是sql的新手,我在我的一个SQL查询中遇到了一个问题。我的问题是,一个人有多个访问日期,他必须符合某些条件。我必须拉最近的资格访问和如果最近的访问不满足条件,那么它应该选择之前符合条件的访问。 例如:

name | visit_dt | x | y | z
 A     04/27/'17  1   1   0
 A     04/26/'17  1   0   0
 B     04/25/'17  1   0   0
 B     04/24/'17  1   1   0
 C     04/23/'17  1   0   0
 C     04/22/'17  1   0   0

在上面的例子中,qe需要一个输出如下: 预期产出:

name | visit_dt | x | y | z
 A     04/27/'17  1   1   0
 B     04/24/'17  1   1   0
 C     04/23/'17  1   0   0

这里的条件是我们应该拉最近的' X'。如果是最新的' X'没有1英寸的Y'然后它应该查找前面的记录,其中Y为1,如果该特定人的所有记录都没有Y为1那么它应该选择最近的' X' 。 我想我的问题很明确。如果有人可以帮助我,那就太好了。

4 个答案:

答案 0 :(得分:1)

您可以通过Y desc,visit_dt desc订购并使用CROSS APPLY解决方案:

select distinct(v1.name), v2.visit_dt, v2.x, v2.y, v2.z
from   visits v1
cross apply (select top(1) name, visit_dt, x, z, y
             from   visits
             where  name = v1.name
             order by y desc, visit_dt desc) v2;

结果是一样的:

| name | visit_dt            | x | y | z |
|------|---------------------|---|---|---|
| A    | 27.04.2017 00:00:00 | 1 | 1 | 0 |
| B    | 24.04.2017 00:00:00 | 1 | 1 | 0 |
| C    | 23.04.2017 00:00:00 | 1 | 0 | 0 |

性能取决于您的索引。

Rextester here

答案 1 :(得分:0)

我想你可以试试这个:

    SELECT NAME
    ,VISIT_DT
    ,X
    ,Y
    ,Z
FROM (
    SELECT *
        ,ROW_NUMBER() OVER (
            PARTITION BY NAME ORDER BY X + Y DESC
                ,VISIT_DT DESC
            ) AS RN
    FROM MYTABLE
    ) B
WHERE RN = 1

使用您的样本数据输出:

NAME                        VISIT_DT                X           Y           Z
--------------------------- ----------------------- ----------- ----------- -----------
A                           2017-04-27 00:00:00.000 1           1           0
B                           2017-04-24 00:00:00.000 1           1           0
C                           2017-04-23 00:00:00.000 1           0           0

答案 2 :(得分:0)

SELECT
     [name]
    ,[visit_dt]
    ,[x]
    ,[y]
    ,[z]
    --,[RowNumber] (for testing)
FROM
(
    SELECT
         [name]
        ,CONVERT(DATE,REPLACE([visit_dt],'''',''),1) AS [visit_dt]
        ,[x]
        ,[y]
        ,[z]
        ,ROW_NUMBER() OVER (PARTITION BY [name] ORDER BY (CASE WHEN [y] = 1 THEN [y] END) DESC, CONVERT(DATE,REPLACE([visit_dt],'''',''),1) DESC) AS [RowNumber]
    FROM
        [DB].[dbo].[Stack]
    WHERE
        [x] = 1
) AS [Visits]
WHERE
    [Visits].[RowNumber] = 1

答案 3 :(得分:0)

那么考虑<div class='col-md-6 body-content'> <router-outlet></router-outlet> </div> 然后x然后y然后考虑z?使用visit_dt对您的记录进行排名:

ROW_NUMBER